From b0832f29e411b5251509b731745a33b2a97c226b Mon Sep 17 00:00:00 2001 From: "1378012178@qq.com" <1378012178@qq.com> Date: Wed, 19 Mar 2025 09:47:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E3=80=81=E8=B0=83=E6=95=B4=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=AD=97=E5=85=B8=E8=A1=A8=201=E3=80=81=E5=90=AF?= =?UTF-8?q?=E7=94=A8=E5=81=9C=E7=94=A8=E7=9A=84=E5=80=BC=202=E3=80=81?= =?UTF-8?q?=E5=81=9C=E7=94=A8=E5=90=8E=E4=BE=9D=E6=97=A7=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=EF=BC=88=E5=8E=9F=E4=B8=8D=E6=98=BE=E7=A4=BA=EF=BC=89=E4=BD=86?= =?UTF-8?q?=E6=98=AF=E5=B0=86=E4=B8=8B=E6=8B=89=E9=80=89=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=B8=BA=E7=A6=81=E7=94=A8=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/common/system/vo/DictModel.java | 106 +- .../ConfigServiceDirectiveController.java | 26 +- .../entity/ConfigServiceDirective.java | 8 +- .../mapper/ConfigServiceDirectiveMapper.java | 14 +- .../xml/ConfigServiceDirectiveMapper.xml | 109 +- .../IConfigServiceDirectiveService.java | 8 +- .../ConfigServiceDirectiveServiceImpl.java | 53 +- .../modules/system/mapper/SysDictMapper.java | 4 +- .../system/mapper/xml/SysDictMapper.xml | 10 +- .../service/impl/SysDictServiceImpl.java | 1477 +++++++++-------- 10 files changed, 979 insertions(+), 836 deletions(-) diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java b/nursing-unit-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java index d31fc09..c178088 100644 --- a/nursing-unit-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java +++ b/nursing-unit-base-core/src/main/java/org/jeecg/common/system/vo/DictModel.java @@ -17,55 +17,73 @@ import lombok.experimental.Accessors; @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @JsonIgnoreProperties(ignoreUnknown = true) -public class DictModel implements Serializable{ - private static final long serialVersionUID = 1L; +public class DictModel implements Serializable { + private static final long serialVersionUID = 1L; - public DictModel() { - } - - public DictModel(String value, String text) { - this.value = value; - this.text = text; - } + public DictModel() { + } - public DictModel(String value, String text, String color) { - this.value = value; - this.text = text; - this.color = color; - } + public DictModel(String value, String text) { + this.value = value; + this.text = text; + } - /** - * 字典value - */ - private String value; - /** - * 字典文本 - */ - private String text; - /** - * 字典颜色 - */ - private String color; + public DictModel(String value, String text, String color) { + this.value = value; + this.text = text; + this.color = color; + } - /** - * 特殊用途: JgEditableTable - * @return - */ - public String getTitle() { - return this.text; - } - /** - * 特殊用途: vue3 Select组件 - */ - public String getLabel() { - return this.text; - } + public DictModel(String value, String text, Integer status) { + this.value = value; + this.text = text; + this.status = status; + } + public DictModel(String value, String text, String color, Integer status) { + this.value = value; + this.text = text; + this.color = color; + this.status = status; + } - /** - * 用于表单设计器 关联记录表数据存储 - * QQYUN-5595【表单设计器】他表字段 导入没有翻译 - */ - private JSONObject jsonObject; + /** + * 字典value + */ + private String value; + /** + * 字典文本 + */ + private String text; + /** + * 字典颜色 + */ + private String color; + /** + * 是否启用 1启用 0不启用 + */ + private Integer status; + + /** + * 特殊用途: JgEditableTable + * + * @return + */ + public String getTitle() { + return this.text; + } + + /** + * 特殊用途: vue3 Select组件 + */ + public String getLabel() { + return this.text; + } + + /** + * 用于表单设计器 关联记录表数据存储 + * QQYUN-5595【表单设计器】他表字段 导入没有翻译 + */ + private JSONObject jsonObject; } diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/controller/ConfigServiceDirectiveController.java b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/controller/ConfigServiceDirectiveController.java index acea519..f2f2149 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/controller/ConfigServiceDirectiveController.java +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/controller/ConfigServiceDirectiveController.java @@ -9,6 +9,7 @@ import com.nu.modules.serviceDirective.service.IConfigServiceDirectiveService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; @@ -56,8 +57,23 @@ public class ConfigServiceDirectiveController extends JeecgController pageList = service.pageList(configServiceDirective, pageNo, pageSize); - return Result.OK(pageList); + Map customeRuleMap = new HashMap<>(); + // 自定义多选的查询规则为:LIKE_WITH_OR + customeRuleMap.put("categoryId", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("typeId", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("instructionTagId", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("izReimbursement", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("izPreferential", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("chargingFrequency", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("cycleType", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("izEnabled", QueryRuleEnum.LIKE_WITH_OR); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(configServiceDirective, req.getParameterMap(), customeRuleMap); + queryWrapper.select("id"); + Page page = new Page(pageNo, pageSize); + IPage list = configServiceDirectiveService.page(page, queryWrapper); + List pageList = service.pageList(configServiceDirective, list); + list.setRecords(pageList); + return Result.OK(list); } /** @@ -72,6 +88,9 @@ public class ConfigServiceDirectiveController extends JeecgController add(@RequestBody ConfigServiceDirective configServiceDirective) { configServiceDirectiveService.save(configServiceDirective); + if (StringUtils.isNotBlank(configServiceDirective.getTags())) { + configServiceDirectiveService.saveTags(configServiceDirective); + } return Result.OK("添加成功!"); } @@ -87,6 +106,9 @@ public class ConfigServiceDirectiveController extends JeecgController edit(@RequestBody ConfigServiceDirective configServiceDirective) { configServiceDirectiveService.updateById(configServiceDirective); + if (StringUtils.isNotBlank(configServiceDirective.getTags())) { + configServiceDirectiveService.saveTags(configServiceDirective); + } return Result.OK("编辑成功!"); } diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/entity/ConfigServiceDirective.java b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/entity/ConfigServiceDirective.java index 7f8258d..d862b2b 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/entity/ConfigServiceDirective.java +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/entity/ConfigServiceDirective.java @@ -43,9 +43,9 @@ public class ConfigServiceDirective implements Serializable { @ApiModelProperty(value = "服务类型") @Dict(dicCode = "id" , dictTable = "config_service_type" , dicText = "type_name") private java.lang.String typeId; - /**指令标签id*/ - @Excel(name = "指令标签", width = 15) - @ApiModelProperty(value = "指令标签") + /**分类标签*/ + @Excel(name = "分类标签", width = 15) + @ApiModelProperty(value = "分类标签") @Dict(dicCode = "instruction_tag" ) private java.lang.String instructionTagId; /**服务指令名称*/ @@ -137,6 +137,8 @@ public class ConfigServiceDirective implements Serializable { private Integer typeRowSpan; @TableField(exist = false) private Integer instructionRowSpan; + @TableField(exist = false) + private String tags; //服务指令标签 List tagList; diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/ConfigServiceDirectiveMapper.java b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/ConfigServiceDirectiveMapper.java index 4624c9d..c16c4cd 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/ConfigServiceDirectiveMapper.java +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/ConfigServiceDirectiveMapper.java @@ -22,8 +22,16 @@ public interface ConfigServiceDirectiveMapper extends BaseMapper pageList( - @Param("page") Page page, - @Param("directive") ConfigServiceDirective directive + List pageList( + @Param("directive") ConfigServiceDirective directive, + @Param("ids") List records ); + // IPage pageList( +// @Param("page") Page page, +// @Param("directive") ConfigServiceDirective directive +// ); + + int deleteTags(@Param("directive") ConfigServiceDirective configServiceDirective); + + int saveTags(@Param("directive") ConfigServiceDirective configServiceDirective); } diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/xml/ConfigServiceDirectiveMapper.xml b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/xml/ConfigServiceDirectiveMapper.xml index ba24d7e..22dfe2e 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/xml/ConfigServiceDirectiveMapper.xml +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/mapper/xml/ConfigServiceDirectiveMapper.xml @@ -35,6 +35,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete + from directive_tag + where directive_id = #{directive.id} + + + + insert into directive_tag (directive_id,tag_id) values + + (#{directive.id}, #{tagId}) + + diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/IConfigServiceDirectiveService.java b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/IConfigServiceDirectiveService.java index 4fdf52a..65464e9 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/IConfigServiceDirectiveService.java +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/IConfigServiceDirectiveService.java @@ -19,5 +19,11 @@ public interface IConfigServiceDirectiveService extends IService records); - IPage pageList(ConfigServiceDirective configServiceDirective, Integer pageNo, Integer pageSize); + List pageList(ConfigServiceDirective configServiceDirective,IPage list); + + /** + * 存储指令标签数据 + * @param configServiceDirective + */ + void saveTags(ConfigServiceDirective configServiceDirective); } diff --git a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/impl/ConfigServiceDirectiveServiceImpl.java b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/impl/ConfigServiceDirectiveServiceImpl.java index cc9956b..d226eaa 100644 --- a/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/impl/ConfigServiceDirectiveServiceImpl.java +++ b/nursing-unit-config/nu-config-biz/src/main/java/com/nu/modules/serviceDirective/service/impl/ConfigServiceDirectiveServiceImpl.java @@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nu.modules.directiveTag.entity.DirectiveTag; import com.nu.modules.serviceDirective.entity.ConfigServiceDirective; import com.nu.modules.serviceDirective.mapper.ConfigServiceDirectiveMapper; import com.nu.modules.serviceDirective.service.IConfigServiceDirectiveService; +import org.apache.commons.compress.utils.Lists; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; import org.springframework.stereotype.Service; @@ -15,6 +17,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Description: 服务指令 @@ -27,33 +30,22 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl pageList(ConfigServiceDirective configServiceDirective, Integer pageNo, Integer pageSize) { - Page page = new Page<>(pageNo, pageSize); - IPage pageList = baseMapper.pageList(page, configServiceDirective); + public List pageList(ConfigServiceDirective configServiceDirective,IPage list_) { + if(list_.getRecords() == null || list_.getRecords().isEmpty()){ + return list_.getRecords(); + } + List list = baseMapper.pageList(configServiceDirective, list_.getRecords()); + //处理服务标签字段 + if (list != null && !list.isEmpty()) { + list.stream().forEach(record -> { + List tagList = record.getTagList(); + record.setTags(tagList.stream().map(DirectiveTag::getId).collect(Collectors.joining(","))); + }); + } //处理单元格合并所需数据 - merge(pageList.getRecords()); - return pageList; + merge(list); + return list; } -// @Override -// public IPage pageList(ConfigServiceDirective configServiceDirective, Integer pageNo, Integer pageSize, HttpServletRequest req) { -// // 自定义查询规则 -// Map customeRuleMap = new HashMap<>(); -// // 自定义多选的查询规则为:LIKE_WITH_OR -// customeRuleMap.put("categoryId", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("typeId", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("instructionTagId", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("izReimbursement", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("izPreferential", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("chargingFrequency", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("cycleType", QueryRuleEnum.LIKE_WITH_OR); -// customeRuleMap.put("izEnabled", QueryRuleEnum.LIKE_WITH_OR); -// QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(configServiceDirective, req.getParameterMap(), customeRuleMap); -// Page page = new Page<>(pageNo, pageSize); -// IPage pageList = page(page, queryWrapper); -// //处理单元格合并所需数据 -// merge(pageList.getRecords()); -// return pageList; -// } /** * 主合并方法 @@ -167,4 +159,15 @@ public class ConfigServiceDirectiveServiceImpl extends ServiceImpl { * @return */ @Deprecated - IPage queryPageTableDictWithFilter(Page page, @Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql); + IPage queryPageTableDictWithFilter(Page page, @Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql,@Param("ena") String ena); /** * 查询 字典表数据 支持查询条件 查询所有 @@ -170,7 +170,7 @@ public interface SysDictMapper extends BaseMapper { * @return */ @Deprecated - List queryTableDictWithFilter(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql); + List queryTableDictWithFilter(@Param("table") String table, @Param("text") String text, @Param("code") String code, @Param("filterSql") String filterSql,@Param("ena") String ena); /** * 查询字典表的数据 diff --git a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml index 531c058..a5d935d 100644 --- a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml +++ b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml @@ -70,7 +70,8 @@ dict.dict_code, item.item_text AS "text", item.item_value AS "value", - item.item_color AS "color" + item.item_color AS "color", + item.status AS "status" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id @@ -82,7 +83,6 @@ ) - AND item.status =1 order by dict.dict_code, item.sort_order @@ -179,7 +179,11 @@ - select ${text} as "text", ${code} as "value" from ${table} + select ${text} as "text", ${code} as "value" + + ,iz_enabled as status + + from ${table} where ${filterSql} diff --git a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java index 3a276bc..d4f9a9a 100644 --- a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java +++ b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; import org.jeecg.modules.system.security.DictQueryBlackListHandler; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -63,402 +64,416 @@ public class SysDictServiceImpl extends ServiceImpl impl private SysDictMapper sysDictMapper; @Autowired private SysDictItemMapper sysDictItemMapper; - @Autowired - private DictQueryBlackListHandler dictQueryBlackListHandler; + @Autowired + private DictQueryBlackListHandler dictQueryBlackListHandler; - @Lazy - @Autowired - private ISysBaseAPI sysBaseAPI; - @Lazy - @Autowired - private RedisUtil redisUtil; + @Lazy + @Autowired + private ISysBaseAPI sysBaseAPI; + @Lazy + @Autowired + private RedisUtil redisUtil; - @Override - public boolean duplicateCheckData(DuplicateCheckVo duplicateCheckVo) { - Long count = null; + @Override + public boolean duplicateCheckData(DuplicateCheckVo duplicateCheckVo) { + Long count = null; - // 1.针对采用 ${}写法的表名和字段进行转义和check - String table = SqlInjectionUtil.getSqlInjectTableName(duplicateCheckVo.getTableName()); - String fieldName = SqlInjectionUtil.getSqlInjectField(duplicateCheckVo.getFieldName()); - duplicateCheckVo.setTableName(table); - duplicateCheckVo.setFieldName(fieldName); + // 1.针对采用 ${}写法的表名和字段进行转义和check + String table = SqlInjectionUtil.getSqlInjectTableName(duplicateCheckVo.getTableName()); + String fieldName = SqlInjectionUtil.getSqlInjectField(duplicateCheckVo.getFieldName()); + duplicateCheckVo.setTableName(table); + duplicateCheckVo.setFieldName(fieldName); - // 2.SQL注入check(只限制非法串改数据库) - //关联表字典(举例:sys_user,realname,id) - SqlInjectionUtil.filterContentMulti(table, fieldName); + // 2.SQL注入check(只限制非法串改数据库) + //关联表字典(举例:sys_user,realname,id) + SqlInjectionUtil.filterContentMulti(table, fieldName); - String checkSql = table + SymbolConstant.COMMA + fieldName + SymbolConstant.COMMA; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, fieldName); - // 3.表字典黑名单check - dictQueryBlackListHandler.isPass(checkSql); + String checkSql = table + SymbolConstant.COMMA + fieldName + SymbolConstant.COMMA; + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, fieldName); + // 3.表字典黑名单check + dictQueryBlackListHandler.isPass(checkSql); - // 4.执行SQL 查询是否存在值 - try{ - //update-begin---author:chenrui ---date:20240715 for:[TV360X-49]postgres日期、年月日时分秒唯一校验报错------------ - if(DbTypeUtils.dbTypeIsPostgre(CommonUtils.getDatabaseTypeEnum())){ - duplicateCheckVo.setFieldName("CAST("+duplicateCheckVo.getFieldName()+" as text)"); - } - //update-end---author:chenrui ---date:20240715 for:[TV360X-49]postgres日期、年月日时分秒唯一校验报错------------ - if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { - // [1].编辑页面校验 - count = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo); - } else { - // [2].添加页面校验 - count = sysDictMapper.duplicateCheckCountSqlNoDataId(duplicateCheckVo); - } - }catch(MyBatisSystemException e){ - log.error(e.getMessage(), e); - String errorCause = "查询异常,请检查唯一校验的配置!"; - throw new JeecgBootException(errorCause); - } + // 4.执行SQL 查询是否存在值 + try { + //update-begin---author:chenrui ---date:20240715 for:[TV360X-49]postgres日期、年月日时分秒唯一校验报错------------ + if (DbTypeUtils.dbTypeIsPostgre(CommonUtils.getDatabaseTypeEnum())) { + duplicateCheckVo.setFieldName("CAST(" + duplicateCheckVo.getFieldName() + " as text)"); + } + //update-end---author:chenrui ---date:20240715 for:[TV360X-49]postgres日期、年月日时分秒唯一校验报错------------ + if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { + // [1].编辑页面校验 + count = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo); + } else { + // [2].添加页面校验 + count = sysDictMapper.duplicateCheckCountSqlNoDataId(duplicateCheckVo); + } + } catch (MyBatisSystemException e) { + log.error(e.getMessage(), e); + String errorCause = "查询异常,请检查唯一校验的配置!"; + throw new JeecgBootException(errorCause); + } - // 4.返回结果 - if (count == null || count == 0) { - // 该值可用 - return true; - } else { - // 该值不可用 - log.info("该值不可用,系统中已存在!"); - return false; - } - } + // 4.返回结果 + if (count == null || count == 0) { + // 该值可用 + return true; + } else { + // 该值不可用 + log.info("该值不可用,系统中已存在!"); + return false; + } + } - /** - * 通过查询指定code 获取字典 - * @param code - * @return - */ - @Override - @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code", unless = "#result == null ") - public List queryDictItemsByCode(String code) { - log.debug("无缓存dictCache的时候调用这里!"); - return sysDictMapper.queryDictItemsByCode(code); - } + /** + * 通过查询指定code 获取字典 + * + * @param code + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE, key = "#code", unless = "#result == null ") + public List queryDictItemsByCode(String code) { + log.debug("无缓存dictCache的时候调用这里!"); + return sysDictMapper.queryDictItemsByCode(code); + } - @Override - @Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE,key = "#code", unless = "#result == null ") - public List queryEnableDictItemsByCode(String code) { - log.debug("无缓存dictCache的时候调用这里!"); - return sysDictMapper.queryEnableDictItemsByCode(code); - } + @Override + @Cacheable(value = CacheConstant.SYS_ENABLE_DICT_CACHE, key = "#code", unless = "#result == null ") + public List queryEnableDictItemsByCode(String code) { + log.debug("无缓存dictCache的时候调用这里!"); + return sysDictMapper.queryEnableDictItemsByCode(code); + } - @Override - public Map> queryDictItemsByCodeList(List dictCodeList) { - List list = sysDictMapper.queryDictItemsByCodeList(dictCodeList); - Map> dictMap = new HashMap(5); - for (DictModelMany dict : list) { - List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); + @Override + public Map> queryDictItemsByCodeList(List dictCodeList) { + List list = sysDictMapper.queryDictItemsByCodeList(dictCodeList); + Map> dictMap = new HashMap(5); + for (DictModelMany dict : list) { + List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); - //update-begin-author:taoyan date:2023-4-28 for: QQYUN-5183【简流】多字段拼接-多选框、下拉框 等需要翻译的字段 - //dict.setDictCode(null); - //update-end-author:taoyan date:2023-4-28 for: QQYUN-5183【简流】多字段拼接-多选框、下拉框 等需要翻译的字段 + //update-begin-author:taoyan date:2023-4-28 for: QQYUN-5183【简流】多字段拼接-多选框、下拉框 等需要翻译的字段 + //dict.setDictCode(null); + //update-end-author:taoyan date:2023-4-28 for: QQYUN-5183【简流】多字段拼接-多选框、下拉框 等需要翻译的字段 - dictItemList.add(new DictModel(dict.getValue(), dict.getText(), dict.getColor())); - } - return dictMap; - } + dictItemList.add(new DictModel(dict.getValue(), dict.getText(), dict.getColor())); + } + return dictMap; + } - @Override - public Map> queryAllDictItems() { - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - long start = System.currentTimeMillis(); - Map> sysAllDictItems = new HashMap(5); - List tenantIds = null; - //------------------------------------------------------------------------------------------------ - //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 - if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { - tenantIds = new ArrayList<>(); - tenantIds.add(0); - if (TenantContext.getTenant() != null) { - tenantIds.add(oConvertUtils.getInt(TenantContext.getTenant())); - } - } - //------------------------------------------------------------------------------------------------ - List sysDictItemList = sysDictMapper.queryAllDictItems(tenantIds); - // 使用groupingBy根据dictCode分组 - sysAllDictItems = sysDictItemList.stream() - .collect(Collectors.groupingBy(DictModelMany::getDictCode, - Collectors.mapping(d -> new DictModel(d.getValue(), d.getText(), d.getColor()), Collectors.toList()))); - log.info(" >>> 1 获取系统字典项耗时(SQL):" + (System.currentTimeMillis() - start) + "毫秒"); + @Override + public Map> queryAllDictItems() { + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + long start = System.currentTimeMillis(); + Map> sysAllDictItems = new HashMap(5); + List tenantIds = null; + //------------------------------------------------------------------------------------------------ + //是否开启系统管理模块的多租户数据隔离【SAAS多租户模式】 + if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { + tenantIds = new ArrayList<>(); + tenantIds.add(0); + if (TenantContext.getTenant() != null) { + tenantIds.add(oConvertUtils.getInt(TenantContext.getTenant())); + } + } + //------------------------------------------------------------------------------------------------ + List sysDictItemList = sysDictMapper.queryAllDictItems(tenantIds); + // 使用groupingBy根据dictCode分组 + sysAllDictItems = sysDictItemList.stream() + .collect(Collectors.groupingBy(DictModelMany::getDictCode, + Collectors.mapping(d -> new DictModel(d.getValue(), d.getText(), d.getColor(), d.getStatus()), Collectors.toList()))); + log.info(" >>> 1 获取系统字典项耗时(SQL):" + (System.currentTimeMillis() - start) + "毫秒"); - Map> enumRes = ResourceUtil.getEnumDictData(); - sysAllDictItems.putAll(enumRes); - log.info(" >>> 2 获取系统字典项耗时(Enum):" + (System.currentTimeMillis() - start) + "毫秒"); + Map> enumRes = ResourceUtil.getEnumDictData(); + sysAllDictItems.putAll(enumRes); + log.info(" >>> 2 获取系统字典项耗时(Enum):" + (System.currentTimeMillis() - start) + "毫秒"); - log.info(" >>> end 获取系统字典库总耗时:" + (System.currentTimeMillis() - start) + "毫秒"); - log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + log.info(" >>> end 获取系统字典库总耗时:" + (System.currentTimeMillis() - start) + "毫秒"); + log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); - //log.info("-------登录加载系统字典-----" + sysAllDictItems.toString()); - return sysAllDictItems; - } + //log.info("-------登录加载系统字典-----" + sysAllDictItems.toString()); + return sysAllDictItems; + } - /** - * 通过查询指定code 获取字典值text - * @param code - * @param key - * @return - */ + /** + * 通过查询指定code 获取字典值text + * + * @param code + * @param key + * @return + */ - @Override - @Cacheable(value = CacheConstant.SYS_DICT_CACHE,key = "#code+':'+#key", unless = "#result == null ") - public String queryDictTextByKey(String code, String key) { - log.debug("无缓存dictText的时候调用这里!"); - return sysDictMapper.queryDictTextByKey(code, key); - } + @Override + @Cacheable(value = CacheConstant.SYS_DICT_CACHE, key = "#code+':'+#key", unless = "#result == null ") + public String queryDictTextByKey(String code, String key) { + log.debug("无缓存dictText的时候调用这里!"); + return sysDictMapper.queryDictTextByKey(code, key); + } - @Override - public Map> queryManyDictByKeys(List dictCodeList, List keys) { - List list = sysDictMapper.queryManyDictByKeys(dictCodeList, keys); - Map> dictMap = new HashMap(5); - for (DictModelMany dict : list) { - List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); - dictItemList.add(new DictModel(dict.getValue(), dict.getText())); - } - //update-begin-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举 - Map> enumRes = ResourceUtil.queryManyDictByKeys(dictCodeList, keys); - dictMap.putAll(enumRes); - //update-end-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举 - return dictMap; - } + @Override + public Map> queryManyDictByKeys(List dictCodeList, List keys) { + List list = sysDictMapper.queryManyDictByKeys(dictCodeList, keys); + Map> dictMap = new HashMap(5); + for (DictModelMany dict : list) { + List dictItemList = dictMap.computeIfAbsent(dict.getDictCode(), i -> new ArrayList<>()); + dictItemList.add(new DictModel(dict.getValue(), dict.getText())); + } + //update-begin-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举 + Map> enumRes = ResourceUtil.queryManyDictByKeys(dictCodeList, keys); + dictMap.putAll(enumRes); + //update-end-author:taoyan date:2022-7-8 for: 系统字典数据应该包括自定义的java类-枚举 + return dictMap; + } - /** - * 通过查询指定table的 text code 获取字典 - * dictTableCache采用redis缓存有效期10分钟 - * @param tableFilterSql - * @param text - * @param code - * @return - */ - @Override - @Deprecated - public List queryTableDictItemsByCode(String tableFilterSql, String text, String code) { - log.debug("无缓存dictTableList的时候调用这里!"); - String str = tableFilterSql+","+text+","+code; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(tableFilterSql, text, code); - // 1.表字典黑名单check - if(!dictQueryBlackListHandler.isPass(str)){ - log.error(dictQueryBlackListHandler.getError()); - return null; - } + /** + * 通过查询指定table的 text code 获取字典 + * dictTableCache采用redis缓存有效期10分钟 + * + * @param tableFilterSql + * @param text + * @param code + * @return + */ + @Override + @Deprecated + public List queryTableDictItemsByCode(String tableFilterSql, String text, String code) { + log.debug("无缓存dictTableList的时候调用这里!"); + String str = tableFilterSql + "," + text + "," + code; + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(tableFilterSql, text, code); + // 1.表字典黑名单check + if (!dictQueryBlackListHandler.isPass(str)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } - // 2.分割SQL获取表名和条件 - String table = null; - String filterSql = null; - if(tableFilterSql.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){ - String[] arr = tableFilterSql.split(" (?i)where "); - table = arr[0]; - filterSql = oConvertUtils.getString(arr[1], null); - }else{ - table = tableFilterSql; - } + // 2.分割SQL获取表名和条件 + String table = null; + String filterSql = null; + if (tableFilterSql.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE) > 0) { + String[] arr = tableFilterSql.split(" (?i)where "); + table = arr[0]; + filterSql = oConvertUtils.getString(arr[1], null); + } else { + table = tableFilterSql; + } - // 3.SQL注入check - SqlInjectionUtil.filterContentMulti(table, text, code); - SqlInjectionUtil.specialFilterContentForDictSql(filterSql); + // 3.SQL注入check + SqlInjectionUtil.filterContentMulti(table, text, code); + SqlInjectionUtil.specialFilterContentForDictSql(filterSql); - // 4.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + // 4.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); + List dictModels = Lists.newArrayList(); + try { + dictModels = sysDictMapper.queryTableDictWithFilter(table, text, code, filterSql, "1"); + } catch (Exception e) { + dictModels = sysDictMapper.queryTableDictWithFilter(table, text, code, filterSql, null); + } + return dictModels; + } - //return sysDictMapper.queryTableDictItemsByCode(tableFilterSql,text,code); - return sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql); - } + @Override + public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) { + log.debug("无缓存dictTableList的时候调用这里!"); - @Override - public List queryTableDictItemsByCodeAndFilter(String table, String text, String code, String filterSql) { - log.debug("无缓存dictTableList的时候调用这里!"); + // 1.SQL注入校验(只限制非法串改数据库) + SqlInjectionUtil.specialFilterContentForDictSql(table); + SqlInjectionUtil.filterContentMulti(text, code); + SqlInjectionUtil.specialFilterContentForDictSql(filterSql); - // 1.SQL注入校验(只限制非法串改数据库) - SqlInjectionUtil.specialFilterContentForDictSql(table); - SqlInjectionUtil.filterContentMulti(text, code); - SqlInjectionUtil.specialFilterContentForDictSql(filterSql); + String str = table + "," + text + "," + code; + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); + // 2.表字典黑名单 Check + if (!dictQueryBlackListHandler.isPass(str)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } - String str = table+","+text+","+code; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); - // 2.表字典黑名单 Check - if(!dictQueryBlackListHandler.isPass(str)){ - log.error(dictQueryBlackListHandler.getError()); - return null; - } + // 3.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); + List dictModels = Lists.newArrayList(); + try { + dictModels = sysDictMapper.queryTableDictWithFilter(table, text, code, filterSql, "1"); + } catch (Exception e) { + dictModels = sysDictMapper.queryTableDictWithFilter(table, text, code, filterSql, null); + } + return dictModels; + } - // 3.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + /** + * 通过查询指定table的 text code 获取字典值text + * dictTableCache采用redis缓存有效期10分钟 + * + * @param table + * @param text + * @param code + * @param key + * @return + */ + @Override + @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE, unless = "#result == null ") + public String queryTableDictTextByKey(String table, String text, String code, String key) { + log.debug("无缓存dictTable的时候调用这里!"); - return sysDictMapper.queryTableDictWithFilter(table,text,code,filterSql); - } + 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; + } + // 2.sql注入check + SqlInjectionUtil.filterContentMulti(table, text, code, key); - /** - * 通过查询指定table的 text code 获取字典值text - * dictTableCache采用redis缓存有效期10分钟 - * @param table - * @param text - * @param code - * @param key - * @return - */ - @Override - @Cacheable(value = CacheConstant.SYS_DICT_TABLE_CACHE, unless = "#result == null ") - public String queryTableDictTextByKey(String table,String text,String code, String key) { - log.debug("无缓存dictTable的时候调用这里!"); + // 3.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); - 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; - } - // 2.sql注入check - SqlInjectionUtil.filterContentMulti(table, text, code, key); + List dictModeList = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, null, Arrays.asList(key)); + if (CollectionUtils.isEmpty(dictModeList)) { + return null; + } else { + return dictModeList.get(0).getText(); + } - // 3.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + //此方法删除(20230902) + //return sysDictMapper.queryTableDictTextByKey(table,text,code,key); + } - List dictModeList = sysDictMapper.queryTableDictByKeysAndFilterSql(table, text, code, null, Arrays.asList(key)); - if(CollectionUtils.isEmpty(dictModeList)){ - return null; - }else{ - return dictModeList.get(0).getText(); - } + @Override + public List queryTableDictTextByKeys(String table, String text, String code, List codeValues, String dataSource) { + String str = table + "," + text + "," + code; + //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]解决分布式下表字典跨库无法查询问题------------ - //此方法删除(20230902) - //return sysDictMapper.queryTableDictTextByKey(table,text,code,key); - } + // 2.分割SQL获取表名和条件 + String filterSql = null; + if (table.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE) > 0) { + String[] arr = table.split(" (?i)where "); + table = arr[0]; + filterSql = arr[1]; + } - @Override - public List queryTableDictTextByKeys(String table, String text, String code, List codeValues, String dataSource) { - String str = table+","+text+","+code; - //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]解决分布式下表字典跨库无法查询问题------------ + // 3.SQL注入check + SqlInjectionUtil.filterContentMulti(table, text, code); + SqlInjectionUtil.specialFilterContentForDictSql(filterSql); - // 2.分割SQL获取表名和条件 - String filterSql = null; - if(table.toLowerCase().indexOf(DataBaseConstant.SQL_WHERE)>0){ - String[] arr = table.split(" (?i)where "); - table = arr[0]; - filterSql = arr[1]; - } + // 4.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); - // 3.SQL注入check - SqlInjectionUtil.filterContentMulti(table, text, code); - SqlInjectionUtil.specialFilterContentForDictSql(filterSql); - - // 4.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); - - //update-begin---author:chenrui ---date:20231221 for:[issues/#5643]解决分布式下表字典跨库无法查询问题------------ + //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条件 - } + 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条件 + } - @Override - public List queryTableDictByKeys(String table, String text, String code, String keys) { - 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; - } + @Override + public List queryTableDictByKeys(String table, String text, String code, String keys) { + 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; + } - return this.queryTableDictByKeys(table, text, code, keys, true); - } + return this.queryTableDictByKeys(table, text, code, keys, true); + } - /** - * 通过查询指定table的 text code 获取字典,包含text和value - * dictTableCache采用redis缓存有效期10分钟 - * @param table - * @param text - * @param code - * @param codeValuesStr (逗号分隔) - * @param delNotExist 是否移除不存在的项,默认为true,设为false如果某个key不存在数据库中,则直接返回key本身 - * @return - */ - @Override - public List queryTableDictByKeys(String table, String text, String code, String codeValuesStr, boolean delNotExist) { - if(oConvertUtils.isEmpty(codeValuesStr)){ - return null; - } + /** + * 通过查询指定table的 text code 获取字典,包含text和value + * dictTableCache采用redis缓存有效期10分钟 + * + * @param table + * @param text + * @param code + * @param codeValuesStr (逗号分隔) + * @param delNotExist 是否移除不存在的项,默认为true,设为false如果某个key不存在数据库中,则直接返回key本身 + * @return + */ + @Override + public List queryTableDictByKeys(String table, String text, String code, String codeValuesStr, boolean delNotExist) { + if (oConvertUtils.isEmpty(codeValuesStr)) { + return null; + } - //1.分割sql获取表名 和 条件sql - String filterSql = null; - if(table.toLowerCase().indexOf("where")!=-1){ - String[] arr = table.split(" (?i)where "); - table = arr[0]; - filterSql = arr[1]; - } + //1.分割sql获取表名 和 条件sql + String filterSql = null; + if (table.toLowerCase().indexOf("where") != -1) { + String[] arr = table.split(" (?i)where "); + table = arr[0]; + filterSql = arr[1]; + } - // 2.SQL注入check - SqlInjectionUtil.filterContentMulti(table, text, code); - SqlInjectionUtil.specialFilterContentForDictSql(filterSql); + // 2.SQL注入check + SqlInjectionUtil.filterContentMulti(table, text, code); + SqlInjectionUtil.specialFilterContentForDictSql(filterSql); - String str = table+","+text+","+code; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); - // 3.表字典黑名单check - if(!dictQueryBlackListHandler.isPass(str)){ - log.error(dictQueryBlackListHandler.getError()); - return null; - } + String str = table + "," + text + "," + code; + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); + // 3.表字典黑名单check + if (!dictQueryBlackListHandler.isPass(str)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } - // 4.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + // 4.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); - //字典条件值 - String[] codeValues = codeValuesStr.split(","); - // 5.查询字典数据 - List dicts = sysDictMapper.queryTableDictByKeysAndFilterSql(SqlInjectionUtil.getSqlInjectTableName(table), - SqlInjectionUtil.getSqlInjectField(text), SqlInjectionUtil.getSqlInjectField(code), filterSql, Arrays.asList(codeValues)); + //字典条件值 + String[] codeValues = codeValuesStr.split(","); + // 5.查询字典数据 + List dicts = sysDictMapper.queryTableDictByKeysAndFilterSql(SqlInjectionUtil.getSqlInjectTableName(table), + SqlInjectionUtil.getSqlInjectField(text), SqlInjectionUtil.getSqlInjectField(code), filterSql, Arrays.asList(codeValues)); - List texts = new ArrayList<>(dicts.size()); - // 6.查询出来的顺序可能是乱的,需要排个序 - for (String conditionalVal : codeValues) { - List res = dicts.stream().filter(i -> conditionalVal.equals(i.getValue())).collect(Collectors.toList()); - if (res.size() > 0) { - texts.add(res.get(0).getText()); - } else if (!delNotExist) { - texts.add(conditionalVal); - } - } - return texts; - } + List texts = new ArrayList<>(dicts.size()); + // 6.查询出来的顺序可能是乱的,需要排个序 + for (String conditionalVal : codeValues) { + List res = dicts.stream().filter(i -> conditionalVal.equals(i.getValue())).collect(Collectors.toList()); + if (res.size() > 0) { + texts.add(res.get(0).getText()); + } else if (!delNotExist) { + texts.add(conditionalVal); + } + } + return texts; + } /** * 根据字典类型id删除关联表中其对应的数据 @@ -466,117 +481,122 @@ public class SysDictServiceImpl extends ServiceImpl impl @Override public boolean deleteByDictId(SysDict sysDict) { sysDict.setDelFlag(CommonConstant.DEL_FLAG_1); - return this.updateById(sysDict); + return this.updateById(sysDict); } @Override @Transactional(rollbackFor = Exception.class) public Integer saveMain(SysDict sysDict, List sysDictItemList) { - int insert=0; - try{ - insert = sysDictMapper.insert(sysDict); - if (sysDictItemList != null) { - for (SysDictItem entity : sysDictItemList) { + int insert = 0; + try { + insert = sysDictMapper.insert(sysDict); + if (sysDictItemList != null) { + for (SysDictItem entity : sysDictItemList) { //update-begin---author:wangshuai ---date:20220211 for:[JTC-1168]如果字典项值为空,则字典项忽略导入------------ - if(oConvertUtils.isEmpty(entity.getItemValue())){ - return -1; + if (oConvertUtils.isEmpty(entity.getItemValue())) { + return -1; } //update-end---author:wangshuai ---date:20220211 for:[JTC-1168]如果字典项值为空,则字典项忽略导入------------ - entity.setDictId(sysDict.getId()); - entity.setStatus(1); - sysDictItemMapper.insert(entity); - } - } - }catch(Exception e){ - return insert; - } - return insert; + entity.setDictId(sysDict.getId()); + entity.setStatus(1); + sysDictItemMapper.insert(entity); + } + } + } catch (Exception e) { + return insert; + } + return insert; } - @Override - public List queryAllDepartBackDictModel() { - return baseMapper.queryAllDepartBackDictModel(); - } + @Override + public List queryAllDepartBackDictModel() { + return baseMapper.queryAllDepartBackDictModel(); + } - @Override - public List queryAllUserBackDictModel() { - return baseMapper.queryAllUserBackDictModel(); - } + @Override + public List queryAllUserBackDictModel() { + return baseMapper.queryAllUserBackDictModel(); + } // @Override // public List queryTableDictItems(String table, String text, String code, String keyword) { // return baseMapper.queryTableDictItems(table, text, code, "%"+keyword+"%"); // } - @Override - public List queryLittleTableDictItems(String tableSql, String text, String code, String condition, String keyword, int pageNo, int pageSize) { - int current = oConvertUtils.getInt(pageNo, 1); - Page page = new Page(current, pageSize); - page.setSearchCount(false); + @Override + public List queryLittleTableDictItems(String tableSql, String text, String code, String condition, String keyword, int pageNo, int pageSize) { + int current = oConvertUtils.getInt(pageNo, 1); + Page page = new Page(current, pageSize); + page.setSearchCount(false); - //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) - // 1. 针对采用 ${}写法的表名和字段进行转义和check - String table = SqlInjectionUtil.getSqlInjectTableName(CommonUtils.getTableNameByTableSql(tableSql)); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) + // 1. 针对采用 ${}写法的表名和字段进行转义和check + String table = SqlInjectionUtil.getSqlInjectTableName(CommonUtils.getTableNameByTableSql(tableSql)); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); - // 2. 查询条件SQL (获取条件sql方法含sql注入校验) - String filterSql = getFilterSql(tableSql, text, code, condition, keyword); + // 2. 查询条件SQL (获取条件sql方法含sql注入校验) + String filterSql = getFilterSql(tableSql, text, code, condition, keyword); - // 3. 返回表字典数据 - IPage pageList = baseMapper.queryPageTableDictWithFilter(page, table, text, code, filterSql); - return pageList.getRecords(); - } + // 3. 返回表字典数据 + IPage pageList = new Page<>(); + try { + pageList = baseMapper.queryPageTableDictWithFilter(page, table, text, code, filterSql, "1"); + } catch (Exception e) { + pageList = baseMapper.queryPageTableDictWithFilter(page, table, text, code, filterSql, null); + } + return pageList.getRecords(); + } - /** - * 获取条件语句 (下拉搜索组件 支持传入排序信息 查询排序) - * - * @param text - * @param code - * @param condition - * @param keyword - * @return - */ - private String getFilterSql(String tableSql, String text, String code, String condition, String keyword){ - String filterSql = ""; - String keywordSql = null; - String sqlWhere = "where "; - String sqlAnd = " and "; + /** + * 获取条件语句 (下拉搜索组件 支持传入排序信息 查询排序) + * + * @param text + * @param code + * @param condition + * @param keyword + * @return + */ + private String getFilterSql(String tableSql, String text, String code, String condition, String keyword) { + String filterSql = ""; + String keywordSql = null; + String sqlWhere = "where "; + String sqlAnd = " and "; - //【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错 - boolean tableHasWhere = tableSql.toLowerCase().contains(sqlWhere); + //【JTC-631】判断如果 table 携带了 where 条件,那么就使用 and 查询,防止报错 + boolean tableHasWhere = tableSql.toLowerCase().contains(sqlWhere); if (tableHasWhere) { - sqlWhere = CommonUtils.getFilterSqlByTableSql(tableSql); - } + sqlWhere = CommonUtils.getFilterSqlByTableSql(tableSql); + } - // 下拉搜索组件 支持传入排序信息 查询排序 - String orderField = "", orderType = ""; - if (oConvertUtils.isNotEmpty(keyword)) { - // 关键字里面如果写入了 排序信息 xxxxx[orderby:create_time,desc] - String orderKey = "[orderby"; - if (keyword.indexOf(orderKey) >= 0 && keyword.endsWith("]")) { - String orderInfo = keyword.substring(keyword.indexOf(orderKey) + orderKey.length() + 1, keyword.length() - 1); - keyword = keyword.substring(0, keyword.indexOf(orderKey)); - String[] orderInfoArray = orderInfo.split(SymbolConstant.COMMA); - orderField = orderInfoArray[0]; - orderType = orderInfoArray[1]; - } + // 下拉搜索组件 支持传入排序信息 查询排序 + String orderField = "", orderType = ""; + if (oConvertUtils.isNotEmpty(keyword)) { + // 关键字里面如果写入了 排序信息 xxxxx[orderby:create_time,desc] + String orderKey = "[orderby"; + if (keyword.indexOf(orderKey) >= 0 && keyword.endsWith("]")) { + String orderInfo = keyword.substring(keyword.indexOf(orderKey) + orderKey.length() + 1, keyword.length() - 1); + keyword = keyword.substring(0, keyword.indexOf(orderKey)); + String[] orderInfoArray = orderInfo.split(SymbolConstant.COMMA); + orderField = orderInfoArray[0]; + orderType = orderInfoArray[1]; + } - if (oConvertUtils.isNotEmpty(keyword)) { - // 判断是否是多选 - if (keyword.contains(SymbolConstant.COMMA)) { - //update-begin--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致 ---- - String inKeywords = "'" + String.join("','", keyword.split(",")) + "'"; - //update-end--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致---- - keywordSql = "(" + text + " in (" + inKeywords + ") or " + code + " in (" + inKeywords + "))"; - } else { - keywordSql = "("+text + " like '%"+keyword+"%' or "+ code + " like '%"+keyword+"%')"; - } - } - } + if (oConvertUtils.isNotEmpty(keyword)) { + // 判断是否是多选 + if (keyword.contains(SymbolConstant.COMMA)) { + //update-begin--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致 ---- + String inKeywords = "'" + String.join("','", keyword.split(",")) + "'"; + //update-end--author:scott--date:20220105--for:JTC-529【表单设计器】 编辑页面报错,in参数采用双引号导致---- + keywordSql = "(" + text + " in (" + inKeywords + ") or " + code + " in (" + inKeywords + "))"; + } else { + keywordSql = "(" + text + " like '%" + keyword + "%' or " + code + " like '%" + keyword + "%')"; + } + } + } - //下拉搜索组件 支持传入排序信息 查询排序 - //update-begin---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ + //下拉搜索组件 支持传入排序信息 查询排序 + //update-begin---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ if (oConvertUtils.isNotEmpty(condition) && oConvertUtils.isNotEmpty(keywordSql)) { filterSql += sqlWhere + (tableHasWhere ? sqlAnd : " ") + condition + sqlAnd + keywordSql; } else if (oConvertUtils.isNotEmpty(condition)) { @@ -586,329 +606,338 @@ public class SysDictServiceImpl extends ServiceImpl impl } else if (tableHasWhere) { filterSql += sqlWhere; } - //update-end---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ - // 增加排序逻辑 - if (oConvertUtils.isNotEmpty(orderField)) { - filterSql += " order by " + orderField + " " + orderType; - } + //update-end---author:chenrui ---date:20240327 for:[QQYUN-8514]Online表单中 下拉搜索框 搜索时报sql错误,生成的SQL多了一个 “and" ------------ + // 增加排序逻辑 + if (oConvertUtils.isNotEmpty(orderField)) { + filterSql += " order by " + orderField + " " + orderType; + } - // 处理返回条件 - // 1.1 返回条件SQL(去掉开头的 where ) - final String wherePrefix = "(?i)where "; // (?i) 表示不区分大小写 - String filterSqlString = filterSql.trim().replaceAll(wherePrefix, ""); - // 1.2 条件SQL进行漏洞 check - SqlInjectionUtil.specialFilterContentForDictSql(filterSqlString); - // 1.3 判断如何返回条件是 order by开头则前面拼上 1=1 - if (oConvertUtils.isNotEmpty(filterSqlString) && filterSqlString.trim().toUpperCase().startsWith("ORDER")) { - filterSqlString = " 1=1 " + filterSqlString; - } - return filterSqlString; - } + // 处理返回条件 + // 1.1 返回条件SQL(去掉开头的 where ) + final String wherePrefix = "(?i)where "; // (?i) 表示不区分大小写 + String filterSqlString = filterSql.trim().replaceAll(wherePrefix, ""); + // 1.2 条件SQL进行漏洞 check + SqlInjectionUtil.specialFilterContentForDictSql(filterSqlString); + // 1.3 判断如何返回条件是 order by开头则前面拼上 1=1 + if (oConvertUtils.isNotEmpty(filterSqlString) && filterSqlString.trim().toUpperCase().startsWith("ORDER")) { + filterSqlString = " 1=1 " + filterSqlString; + } + return filterSqlString; + } - @Override - public List queryAllTableDictItems(String table, String text, String code, String condition, String keyword) { - // 1.获取条件sql - String filterSql = getFilterSql(table, text, code, condition, keyword); + @Override + public List queryAllTableDictItems(String table, String text, String code, String condition, String keyword) { + // 1.获取条件sql + String filterSql = getFilterSql(table, text, code, condition, keyword); - // 为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) - // 2.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); + // 为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) + // 2.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); + List ls = Lists.newArrayList(); + try { + ls = baseMapper.queryTableDictWithFilter(table, text, code, filterSql, "1"); + } catch (Exception e) { + ls = baseMapper.queryTableDictWithFilter(table, text, code, filterSql, null); + } + return ls; + } - List ls = baseMapper.queryTableDictWithFilter(table, text, code, filterSql); - return ls; - } + @Override + public List queryTreeList(Map query, String table, String text, String code, String pidField, String pid, String hasChildField, int converIsLeafVal) { + //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) + // 1.针对采用 ${}写法的表名和字段进行转义和check + table = SqlInjectionUtil.getSqlInjectTableName(table); + text = SqlInjectionUtil.getSqlInjectField(text); + code = SqlInjectionUtil.getSqlInjectField(code); + pidField = SqlInjectionUtil.getSqlInjectField(pidField); + hasChildField = SqlInjectionUtil.getSqlInjectField(hasChildField); - @Override - public List queryTreeList(Map query, String table, String text, String code, String pidField, String pid, String hasChildField, int converIsLeafVal) { - //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) - // 1.针对采用 ${}写法的表名和字段进行转义和check - table = SqlInjectionUtil.getSqlInjectTableName(table); - text = SqlInjectionUtil.getSqlInjectField(text); - code = SqlInjectionUtil.getSqlInjectField(code); - pidField = SqlInjectionUtil.getSqlInjectField(pidField); - hasChildField = SqlInjectionUtil.getSqlInjectField(hasChildField); + if (oConvertUtils.isEmpty(text) || oConvertUtils.isEmpty(code)) { + log.warn("text={},code={}", text, code); + log.warn("加载树字典参数有误,text和code不允许为空!"); + return null; + } - if(oConvertUtils.isEmpty(text) || oConvertUtils.isEmpty(code)){ - log.warn("text={},code={}", text, code); - log.warn("加载树字典参数有误,text和code不允许为空!"); - return null; - } + // 2.检测最终SQL是否存在SQL注入风险 + String dictCode = table + "," + text + "," + code; + SqlInjectionUtil.filterContentMulti(dictCode); - // 2.检测最终SQL是否存在SQL注入风险 - String dictCode = table + "," + text + "," + code; - SqlInjectionUtil.filterContentMulti(dictCode); + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); + // 3.表字典SQL表名黑名单 Check + if (!dictQueryBlackListHandler.isPass(dictCode)) { + log.error("Sql异常:{}", dictQueryBlackListHandler.getError()); + return null; + } + // 4.检测查询条件是否存在SQL注入 + Map queryParams = null; + if (query != null) { + queryParams = new HashMap<>(5); + for (Map.Entry searchItem : query.entrySet()) { + String fieldName = searchItem.getKey(); + queryParams.put(SqlInjectionUtil.getSqlInjectField(fieldName), searchItem.getValue()); + } + } - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); - // 3.表字典SQL表名黑名单 Check - if(!dictQueryBlackListHandler.isPass(dictCode)){ - log.error("Sql异常:{}", dictQueryBlackListHandler.getError()); - return null; - } - // 4.检测查询条件是否存在SQL注入 - Map queryParams = null; - if (query != null) { - queryParams = new HashMap<>(5); - for (Map.Entry searchItem : query.entrySet()) { - String fieldName = searchItem.getKey(); - queryParams.put(SqlInjectionUtil.getSqlInjectField(fieldName), searchItem.getValue()); - } - } + return baseMapper.queryTreeList(queryParams, table, text, code, pidField, pid, hasChildField, converIsLeafVal); + } - return baseMapper.queryTreeList(queryParams, table, text, code, pidField, pid, hasChildField, converIsLeafVal); - } + @Override + public void deleteOneDictPhysically(String id) { + this.baseMapper.deleteOneById(id); + this.sysDictItemMapper.delete(new LambdaQueryWrapper().eq(SysDictItem::getDictId, id)); + } - @Override - public void deleteOneDictPhysically(String id) { - this.baseMapper.deleteOneById(id); - this.sysDictItemMapper.delete(new LambdaQueryWrapper().eq(SysDictItem::getDictId,id)); - } + @Override + public void updateDictDelFlag(int delFlag, String id) { + baseMapper.updateDictDelFlag(delFlag, id); + } - @Override - public void updateDictDelFlag(int delFlag, String id) { - baseMapper.updateDictDelFlag(delFlag,id); - } + @Override + public List queryDeleteList(String tenantId) { + //update-begin---author:wangshuai---date:2024-02-27---for:【QQYUN-8340】回收站查找软删除记录时,没有判断是否启用多租户,造成可以查找并回收其他租户的数据 #5907--- + if (MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL) { + if (oConvertUtils.isEmpty(tenantId)) { + return new ArrayList<>(); + } + return baseMapper.queryDeleteListBtTenantId(oConvertUtils.getInt(tenantId)); + } + //update-end---author:wangshuai---date:2024-02-27---for:【QQYUN-8340】回收站查找软删除记录时,没有判断是否启用多租户,造成可以查找并回收其他租户的数据 #5907--- + return baseMapper.queryDeleteList(); + } - @Override - public List queryDeleteList(String tenantId) { - //update-begin---author:wangshuai---date:2024-02-27---for:【QQYUN-8340】回收站查找软删除记录时,没有判断是否启用多租户,造成可以查找并回收其他租户的数据 #5907--- - if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){ - if(oConvertUtils.isEmpty(tenantId)){ - return new ArrayList<>(); - } - return baseMapper.queryDeleteListBtTenantId(oConvertUtils.getInt(tenantId)); - } - //update-end---author:wangshuai---date:2024-02-27---for:【QQYUN-8340】回收站查找软删除记录时,没有判断是否启用多租户,造成可以查找并回收其他租户的数据 #5907--- - return baseMapper.queryDeleteList(); - } + @Override + public List queryDictTablePageList(DictQuery query, int pageSize, int pageNo) { + Page page = new Page(pageNo, pageSize, false); - @Override - public List queryDictTablePageList(DictQuery query, int pageSize, int pageNo) { - Page page = new Page(pageNo,pageSize,false); + //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) + // 1. 针对采用 ${}写法的表名和字段进行转义和check + String table = SqlInjectionUtil.getSqlInjectTableName(query.getTable()); + String text = SqlInjectionUtil.getSqlInjectTableName(query.getText()); + String code = SqlInjectionUtil.getSqlInjectTableName(query.getCode()); + query.setCode(table); + query.setTable(text); + query.setText(code); - //为了防止sql(jeecg提供了防注入的方法,可以在拼接 SQL 语句时自动对参数进行转义,避免SQL注入攻击) - // 1. 针对采用 ${}写法的表名和字段进行转义和check - String table = SqlInjectionUtil.getSqlInjectTableName(query.getTable()); - String text = SqlInjectionUtil.getSqlInjectTableName(query.getText()); - String code = SqlInjectionUtil.getSqlInjectTableName(query.getCode()); - query.setCode(table); - query.setTable(text); - query.setText(code); + String dictCode = table + "," + text + "," + code; + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); + // 2.表字典黑名单check + if (!dictQueryBlackListHandler.isPass(dictCode)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } - String dictCode = table+","+text+","+code; - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(table, text, code); - // 2.表字典黑名单check - if(!dictQueryBlackListHandler.isPass(dictCode)){ - log.error(dictQueryBlackListHandler.getError()); - return null; - } + // 3.SQL注入check + SqlInjectionUtil.filterContentMulti(dictCode); - // 3.SQL注入check - SqlInjectionUtil.filterContentMulti(dictCode); + Page pageList = baseMapper.queryDictTablePageList(page, query); + return pageList.getRecords(); + } - Page pageList = baseMapper.queryDictTablePageList(page, query); - return pageList.getRecords(); - } + @Override + public List getDictItems(String dictCode) { + List ls; + if (dictCode.contains(SymbolConstant.COMMA)) { + //关联表字典(举例:sys_user,realname,id) + String[] params = dictCode.split(","); + if (params.length < 3) { + // 字典Code格式不正确 + return null; + } - @Override - public List getDictItems(String dictCode) { - List ls; - if (dictCode.contains(SymbolConstant.COMMA)) { - //关联表字典(举例:sys_user,realname,id) - String[] params = dictCode.split(","); - if (params.length < 3) { - // 字典Code格式不正确 - return null; - } + if (params.length == 4) { + ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]); + } else if (params.length == 3) { + ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]); + } else { + // 字典Code格式不正确 + return null; + } + } else { + //字典表 + ls = this.queryDictItemsByCode(dictCode); + } + //update-begin-author:taoyan date:2022-8-30 for: 字典获取可以获取枚举类的数据 + if (ls == null || ls.size() == 0) { + Map> map = ResourceUtil.getEnumDictData(); + if (map.containsKey(dictCode)) { + return map.get(dictCode); + } + } + //update-end-author:taoyan date:2022-8-30 for: 字典获取可以获取枚举类的数据 + return ls; + } - if (params.length == 4) { - ls = this.queryTableDictItemsByCodeAndFilter(params[0], params[1], params[2], params[3]); - } else if (params.length == 3) { - ls = this.queryTableDictItemsByCode(params[0], params[1], params[2]); - } else { - // 字典Code格式不正确 - return null; - } - } else { - //字典表 - ls = this.queryDictItemsByCode(dictCode); - } - //update-begin-author:taoyan date:2022-8-30 for: 字典获取可以获取枚举类的数据 - if (ls == null || ls.size() == 0) { - Map> map = ResourceUtil.getEnumDictData(); - if (map.containsKey(dictCode)) { - return map.get(dictCode); - } - } - //update-end-author:taoyan date:2022-8-30 for: 字典获取可以获取枚举类的数据 - return ls; - } + @Override + public List loadDict(String dictCode, String keyword, Integer pageNo, Integer pageSize) { + // 【QQYUN-6533】表字典白名单check + sysBaseAPI.dictTableWhiteListCheckByDict(dictCode); + // 1.表字典黑名单check + if (!dictQueryBlackListHandler.isPass(dictCode)) { + log.error(dictQueryBlackListHandler.getError()); + return null; + } - @Override - public List loadDict(String dictCode, String keyword, Integer pageNo, Integer pageSize) { - // 【QQYUN-6533】表字典白名单check - sysBaseAPI.dictTableWhiteListCheckByDict(dictCode); - // 1.表字典黑名单check - if(!dictQueryBlackListHandler.isPass(dictCode)){ - log.error(dictQueryBlackListHandler.getError()); - return null; - } + // 2.字典SQL注入风险check + SqlInjectionUtil.specialFilterContentForDictSql(dictCode); - // 2.字典SQL注入风险check - SqlInjectionUtil.specialFilterContentForDictSql(dictCode); + if (dictCode.contains(SymbolConstant.COMMA)) { + //update-begin-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件 + String[] params = dictCode.split(","); + String condition = null; + if (params.length != 3 && params.length != 4) { + // 字典Code格式不正确 + return null; + } else if (params.length == 4) { + condition = params[3]; + // update-begin-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 + if (condition.indexOf(SymbolConstant.SYS_VAR_PREFIX) >= 0) { + condition = QueryGenerator.getSqlRuleValue(condition); + } + // update-end-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 + } - if (dictCode.contains(SymbolConstant.COMMA)) { - //update-begin-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件 - String[] params = dictCode.split(","); - String condition = null; - if (params.length != 3 && params.length != 4) { - // 字典Code格式不正确 - return null; - } else if (params.length == 4) { - condition = params[3]; - // update-begin-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 - if(condition.indexOf(SymbolConstant.SYS_VAR_PREFIX)>=0){ - condition = QueryGenerator.getSqlRuleValue(condition); - } - // update-end-author:taoyan date:20220314 for: online表单下拉搜索框表字典配置#{sys_org_code}报错 #3500 - } + // 字典Code格式不正确 [表名为空] + if (oConvertUtils.isEmpty(params[0])) { + return null; + } + List ls; + if (pageSize != null) { + ls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageNo, pageSize); + } else { + ls = this.queryAllTableDictItems(params[0], params[1], params[2], condition, keyword); + } + //update-end-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件 + return ls; + } else { + // 字典Code格式不正确 + return null; + } + } - // 字典Code格式不正确 [表名为空] - if(oConvertUtils.isEmpty(params[0])){ - return null; - } - List ls; - if (pageSize != null) { - ls = this.queryLittleTableDictItems(params[0], params[1], params[2], condition, keyword, pageNo,pageSize); - } else { - ls = this.queryAllTableDictItems(params[0], params[1], params[2], condition, keyword); - } - //update-end-author:taoyan date:20210329 for: 下拉搜索不支持表名后加查询条件 - return ls; - } else { - // 字典Code格式不正确 - return null; - } - } + @Override + public List getDictListByLowAppId(String lowAppId) { + int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); + List list = baseMapper.getDictListByLowAppId(lowAppId, tenantId); + //查询字典下面的字典项 + List dictVoList = new ArrayList<>(); + for (SysDict dict : list) { + SysDictVo dictVo = new SysDictVo(); + BeanUtils.copyProperties(dict, dictVo); + List sysDictItems = sysDictItemMapper.selectItemsByMainId(dict.getId()); + dictVo.setDictItemsList(sysDictItems); + dictVoList.add(dictVo); + } + return dictVoList; + } - @Override - public List getDictListByLowAppId(String lowAppId) { - int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0); - List list = baseMapper.getDictListByLowAppId(lowAppId,tenantId); - //查询字典下面的字典项 - List dictVoList = new ArrayList<>(); - for (SysDict dict:list) { - SysDictVo dictVo = new SysDictVo(); - BeanUtils.copyProperties(dict,dictVo); - List sysDictItems = sysDictItemMapper.selectItemsByMainId(dict.getId()); - dictVo.setDictItemsList(sysDictItems); - dictVoList.add(dictVo); - } - return dictVoList; - } + @Override + public String addDictByLowAppId(SysDictVo sysDictVo) { + String[] dictResult = this.addDict(sysDictVo.getDictName(), sysDictVo.getLowAppId(), sysDictVo.getTenantId()); + String id = dictResult[0]; + String code = dictResult[1]; + this.addDictItem(id, sysDictVo.getDictItemsList()); + return code; + } - @Override - public String addDictByLowAppId(SysDictVo sysDictVo) { - String[] dictResult = this.addDict(sysDictVo.getDictName(),sysDictVo.getLowAppId(),sysDictVo.getTenantId()); - String id = dictResult[0]; - String code = dictResult[1]; - this.addDictItem(id,sysDictVo.getDictItemsList()); - return code; - } + @Override + public void editDictByLowAppId(SysDictVo sysDictVo) { + String id = sysDictVo.getId(); + SysDict dict = baseMapper.selectById(id); + if (null == dict) { + throw new JeecgBootException("字典数据不存在"); + } + //判断应用id和数据库中的是否一致,不一致不让修改 + if (!dict.getLowAppId().equals(sysDictVo.getLowAppId())) { + throw new JeecgBootException("字典数据不存在"); + } + SysDict sysDict = new SysDict(); + sysDict.setDictName(sysDictVo.getDictName()); + sysDict.setId(id); + baseMapper.updateById(sysDict); + this.updateDictItem(id, sysDictVo.getDictItemsList()); + // 删除字典缓存 + redisUtil.removeAll(CacheConstant.SYS_DICT_CACHE + "::" + dict.getDictCode()); + } - @Override - public void editDictByLowAppId(SysDictVo sysDictVo) { - String id = sysDictVo.getId(); - SysDict dict = baseMapper.selectById(id); - if(null == dict){ - throw new JeecgBootException("字典数据不存在"); - } - //判断应用id和数据库中的是否一致,不一致不让修改 - if(!dict.getLowAppId().equals(sysDictVo.getLowAppId())){ - throw new JeecgBootException("字典数据不存在"); - } - SysDict sysDict = new SysDict(); - sysDict.setDictName(sysDictVo.getDictName()); - sysDict.setId(id); - baseMapper.updateById(sysDict); - this.updateDictItem(id,sysDictVo.getDictItemsList()); - // 删除字典缓存 - redisUtil.removeAll(CacheConstant.SYS_DICT_CACHE + "::" + dict.getDictCode()); - } + /** + * 还原逻辑删除 + * + * @param ids + */ + @Override + public boolean revertLogicDeleted(List ids) { + return baseMapper.revertLogicDeleted(ids) > 0; + } - /** - * 还原逻辑删除 - * @param ids - */ - @Override - public boolean revertLogicDeleted(List ids) { - return baseMapper.revertLogicDeleted(ids) > 0; - } + /** + * 彻底删除 + * + * @param ids + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean removeLogicDeleted(List ids) { + // 1. 删除字典 + int line = this.baseMapper.removeLogicDeleted(ids); + // 2. 删除字典选项配置 + line += this.sysDictItemMapper.delete(new LambdaQueryWrapper().in(SysDictItem::getDictId, ids)); + return line > 0; + } - /** - * 彻底删除 - * @param ids - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean removeLogicDeleted(List ids) { - // 1. 删除字典 - int line = this.baseMapper.removeLogicDeleted(ids); - // 2. 删除字典选项配置 - line += this.sysDictItemMapper.delete(new LambdaQueryWrapper().in(SysDictItem::getDictId, ids)); - return line > 0; - } + /** + * 添加字典 + * + * @param dictName + */ + private String[] addDict(String dictName, String lowAppId, Integer tenantId) { + SysDict dict = new SysDict(); + dict.setDictName(dictName); + dict.setDictCode(RandomUtil.randomString(10)); + dict.setDelFlag(Integer.valueOf(CommonConstant.STATUS_0)); + dict.setLowAppId(lowAppId); + dict.setTenantId(tenantId); + baseMapper.insert(dict); + String[] dictResult = new String[]{dict.getId(), dict.getDictCode()}; + return dictResult; + } - /** - * 添加字典 - * @param dictName - */ - private String[] addDict(String dictName,String lowAppId, Integer tenantId) { - SysDict dict = new SysDict(); - dict.setDictName(dictName); - dict.setDictCode(RandomUtil.randomString(10)); - dict.setDelFlag(Integer.valueOf(CommonConstant.STATUS_0)); - dict.setLowAppId(lowAppId); - dict.setTenantId(tenantId); - baseMapper.insert(dict); - String[] dictResult = new String[]{dict.getId(), dict.getDictCode()}; - return dictResult; - } + /** + * 添加字典子项 + * + * @param id + * @param dictItemList + */ + private void addDictItem(String id, List dictItemList) { + if (null != dictItemList && dictItemList.size() > 0) { + for (SysDictItem dictItem : dictItemList) { + SysDictItem sysDictItem = new SysDictItem(); + BeanUtils.copyProperties(dictItem, sysDictItem); + sysDictItem.setDictId(id); + sysDictItem.setId(""); + sysDictItem.setStatus(Integer.valueOf(CommonConstant.STATUS_1)); + sysDictItemMapper.insert(sysDictItem); + } + } + } - /** - * 添加字典子项 - * @param id - * @param dictItemList - */ - private void addDictItem(String id,List dictItemList) { - if(null!=dictItemList && dictItemList.size()>0){ - for (SysDictItem dictItem:dictItemList) { - SysDictItem sysDictItem = new SysDictItem(); - BeanUtils.copyProperties(dictItem,sysDictItem); - sysDictItem.setDictId(id); - sysDictItem.setId(""); - sysDictItem.setStatus(Integer.valueOf(CommonConstant.STATUS_1)); - sysDictItemMapper.insert(sysDictItem); - } - } - } - - /** - * 更新字典子项 - * @param id - * @param dictItemList - */ - private void updateDictItem(String id,List dictItemList){ - //先删除在新增 因为排序可能不一致 - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(SysDictItem::getDictId,id); - sysDictItemMapper.delete(query); - //新增子项 - this.addDictItem(id,dictItemList); - } + /** + * 更新字典子项 + * + * @param id + * @param dictItemList + */ + private void updateDictItem(String id, List dictItemList) { + //先删除在新增 因为排序可能不一致 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysDictItem::getDictId, id); + sysDictItemMapper.delete(query); + //新增子项 + this.addDictItem(id, dictItemList); + } }