diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java b/nursing-unit-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java index 76b9d509..ebf451c4 100644 --- a/nursing-unit-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java +++ b/nursing-unit-base-core/src/main/java/org/jeecg/common/system/query/QueryGenerator.java @@ -2,6 +2,7 @@ package org.jeecg.common.system.query; import java.beans.PropertyDescriptor; import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; import java.math.BigDecimal; import java.net.URLDecoder; import java.text.ParseException; @@ -11,6 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.baomidou.mybatisplus.annotation.TableField; import org.apache.commons.beanutils.PropertyUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.DataBaseConstant; @@ -113,6 +115,179 @@ public class QueryGenerator { } //update-end---author:chenrui ---date:20240527 for:[TV360X-378]增加自定义字段查询规则功能------------ + public static QueryWrapper initQueryWrapper(String columnPrefix,T searchObj,Map parameterMap){ + long start = System.currentTimeMillis(); + QueryWrapper queryWrapper = new QueryWrapper(); + installMplus(queryWrapper, columnPrefix, searchObj, parameterMap); + log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); + return queryWrapper; + } + /** + * 组装Mybatis Plus 查询条件 + *

使用此方法 需要有如下几点注意: + *
1.使用QueryWrapper 而非LambdaQueryWrapper; + *
2.实例化QueryWrapper时不可将实体传入参数 + *
错误示例:如QueryWrapper queryWrapper = new QueryWrapper(jeecgDemo); + *
正确示例:QueryWrapper queryWrapper = new QueryWrapper(); + *
3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 + */ + private static void installMplus(QueryWrapper queryWrapper,String columnPrefix,Object searchObj,Map parameterMap) { + + /* + * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} + 但是不支持在自定义SQL中写orgCode in #{sys_org_code} + 当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}' + */ + + //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 + PropertyDescriptor[] origDescriptors = PropertyUtils.getPropertyDescriptors(searchObj); + Map ruleMap = getRuleMap(); + + //权限规则自定义SQL表达式 + for (String c : ruleMap.keySet()) { + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); + } + } + + String name, type, column; + // update-begin--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- + //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题 + Map fieldColumnMap = new HashMap<>(5); + for (int i = 0; i < origDescriptors.length; i++) { + //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况 + name = origDescriptors[i].getName(); + type = origDescriptors[i].getPropertyType().toString(); + try { + if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) { + continue; + } + + Object value = PropertyUtils.getSimpleProperty(searchObj, name); + column = getTableFieldName(searchObj.getClass(), name); + if(column==null){ + //column为null只有一种情况 那就是 添加了注解@TableField(exist = false) 后续都不用处理了 + continue; + } + //二开项目组新增,为了支持多表,添加别名 + if(oConvertUtils.isNotEmpty(columnPrefix)){ + column = columnPrefix + "." + column; + } + fieldColumnMap.put(name,column); + //数据权限查询 + if(ruleMap.containsKey(name)) { + addRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper); + } + //区间查询 + doIntervalQuery(queryWrapper, parameterMap, type, name, column); + //判断单值 参数带不同标识字符串 走不同的查询 + //TODO 这种前后带逗号的支持分割后模糊查询(多选字段查询生效) 示例:,1,3, + if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) { + String multiLikeval = value.toString().replace(",,", COMMA); + String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA); + final String field = oConvertUtils.camelToUnderline(column); + if(vals.length>1) { + queryWrapper.and(j -> { + log.info("---查询过滤器,Query规则---field:{}, rule:{}, value:{}", field, "like", vals[0]); + j = j.like(field,vals[0]); + for (int k=1;k j.like(field,vals[0])); + } + }else { + //根据参数值带什么关键字符串判断走什么类型的查询 + QueryRuleEnum rule = convert2Rule(value); + value = replaceValue(rule,value); + // add -begin 添加判断为字符串时设为全模糊查询 + //if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) { + // 可以设置左右模糊或全模糊,因人而异 + //rule = QueryRuleEnum.LIKE; + //} + // add -end 添加判断为字符串时设为全模糊查询 + addEasyQuery(queryWrapper, column, rule, value); + } + + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + // 排序逻辑 处理 + doMultiFieldsOrder(queryWrapper, parameterMap, fieldColumnMap); + + //高级查询 + doSuperQuery(queryWrapper, parameterMap, fieldColumnMap); + // update-end--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询------- + + } + /** + * 获取表字段名 + * @param clazz + * @param name + * @return + */ + private static String getTableFieldName(Class clazz, String name) { + try { + //如果字段加注解了@TableField(exist = false),不走DB查询 + Field field = null; + try { + field = clazz.getDeclaredField(name); + } catch (NoSuchFieldException e) { + //e.printStackTrace(); + } + + //如果为空,则去父类查找字段 + if (field == null) { + List allFields = getClassFields(clazz); + List searchFields = allFields.stream().filter(a -> a.getName().equals(name)).collect(Collectors.toList()); + if(searchFields!=null && searchFields.size()>0){ + field = searchFields.get(0); + } + } + + if (field != null) { + TableField tableField = field.getAnnotation(TableField.class); + if (tableField != null){ + if(tableField.exist() == false){ + //如果设置了TableField false 这个字段不需要处理 + return null; + }else{ + String column = tableField.value(); + //如果设置了TableField value 这个字段是实体字段 + if(!"".equals(column)){ + return column; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return name; + } + + /** + * 获取class的 包括父类的 + * @param clazz + * @return + */ + private static List getClassFields(Class clazz) { + List list = new ArrayList(); + Field[] fields; + do{ + fields = clazz.getDeclaredFields(); + for(int i = 0;i使用此方法 需要有如下几点注意: diff --git a/nursing-unit-common/src/main/java/com/nu/entity/CgdInfoEntity.java b/nursing-unit-common/src/main/java/com/nu/entity/CgdInfoEntity.java index 749e3b0e..66191560 100644 --- a/nursing-unit-common/src/main/java/com/nu/entity/CgdInfoEntity.java +++ b/nursing-unit-common/src/main/java/com/nu/entity/CgdInfoEntity.java @@ -1,6 +1,7 @@ package com.nu.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; @@ -9,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; @@ -77,9 +79,19 @@ public class CgdInfoEntity implements Serializable { /**到货单间*/ private String arrivalPrice; /**物料类别*/ + + @Dict(dictTable = "nu_config_material_category", dicText = "category_name", dicCode = "id") private String categoryId; /**物料类型*/ + @Dict(dictTable = "nu_config_material_type", dicText = "type_name", dicCode = "id") private String typeId; /**用药类型*/ + @Dict(dictTable = "nu_config_material_medication", dicText = "medication_name", dicCode = "id") private String medicationId; + /**物料图片*/ + private String materialImg; + @TableField(exist = false) + private String tagType; + @TableField(exist = false) + private String tagName; } diff --git a/nursing-unit-common/src/main/java/com/nu/entity/MaterialInfoEntity.java b/nursing-unit-common/src/main/java/com/nu/entity/MaterialInfoEntity.java index f400bccc..74894f0f 100644 --- a/nursing-unit-common/src/main/java/com/nu/entity/MaterialInfoEntity.java +++ b/nursing-unit-common/src/main/java/com/nu/entity/MaterialInfoEntity.java @@ -97,6 +97,8 @@ public class MaterialInfoEntity implements Serializable { /**物料下县*/ private String lowerLimit; private String tagName; + + @Dict(dicCode = "wl_tag_type") private String tagType; private String treeId;//树id,用于查询 @@ -118,4 +120,8 @@ public class MaterialInfoEntity implements Serializable { private java.lang.String izEnabledName; private java.lang.String wlId; + + private String categoryName; + private String typeName; + private String medicationName; } diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/entity/ConfigMaterialInfo.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/entity/ConfigMaterialInfo.java index 89f87f86..f0a72121 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/entity/ConfigMaterialInfo.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/entity/ConfigMaterialInfo.java @@ -179,4 +179,13 @@ public class ConfigMaterialInfo implements Serializable { @TableField(exist = false) private String paramWlxx;//选择物料的时候物料查询信息 + + @TableField(exist = false) + private String categoryName; + @TableField(exist = false) + private String typeName; + @TableField(exist = false) + private String medicationName; + @TableField(exist = false) + private String tagName; } diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/mapper/xml/ConfigMaterialInfoMapper.xml b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/mapper/xml/ConfigMaterialInfoMapper.xml index 1819fb1f..8587c3d5 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/mapper/xml/ConfigMaterialInfoMapper.xml +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/ConfigMaterial/mapper/xml/ConfigMaterialInfoMapper.xml @@ -35,11 +35,17 @@ \ No newline at end of file diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/entity/NuInvoicingCgdInfo.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/entity/NuInvoicingCgdInfo.java index 3824ecf5..1ee81a4e 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/entity/NuInvoicingCgdInfo.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/entity/NuInvoicingCgdInfo.java @@ -134,6 +134,8 @@ public class NuInvoicingCgdInfo implements Serializable { @TableField(exist = false) private String kcsl; @TableField(exist = false) + private String tagType; + @TableField(exist = false) private String tagName; @TableField(exist = false) private String materialImg; diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/NuInvoicingCgdInfoMapper.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/NuInvoicingCgdInfoMapper.java index 89337dc5..26e36bd3 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/NuInvoicingCgdInfoMapper.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/NuInvoicingCgdInfoMapper.java @@ -2,6 +2,9 @@ package com.nu.modules.cgd.mapper; import java.util.List; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; import com.nu.modules.cgd.entity.NuInvoicingCgdInfo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -14,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface NuInvoicingCgdInfoMapper extends BaseMapper { + List queryCgdInfoList(Page page, @Param(Constants.WRAPPER) QueryWrapper queryWrapper); } diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/xml/NuInvoicingCgdInfoMapper.xml b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/xml/NuInvoicingCgdInfoMapper.xml index cc3166e7..4599aec6 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/xml/NuInvoicingCgdInfoMapper.xml +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/mapper/xml/NuInvoicingCgdInfoMapper.xml @@ -2,4 +2,10 @@ + \ No newline at end of file diff --git a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/service/impl/NuInvoicingCgdMainServiceImpl.java b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/service/impl/NuInvoicingCgdMainServiceImpl.java index a581da9a..4b6bbde8 100644 --- a/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/service/impl/NuInvoicingCgdMainServiceImpl.java +++ b/nursing-unit-invoicing/nu-invoicing-biz/src/main/java/com/nu/modules/cgd/service/impl/NuInvoicingCgdMainServiceImpl.java @@ -376,10 +376,9 @@ public class NuInvoicingCgdMainServiceImpl extends ServiceImpl queryCgdInfoList(Integer pageNo, Integer pageSize, CgdInfoEntity cgdInfoEntityDto, HttpServletRequest req) { NuInvoicingCgdInfo nuInvoicingCgdInfo = new NuInvoicingCgdInfo(); BeanUtils.copyProperties(cgdInfoEntityDto,nuInvoicingCgdInfo); - Map customeRuleMap = new HashMap<>(); - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(nuInvoicingCgdInfo, req.getParameterMap(), customeRuleMap); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper("a",nuInvoicingCgdInfo, req.getParameterMap()); Page page = new Page<>(pageNo, pageSize); - List list = cgdInfoMapper.selectList(page,queryWrapper); + List list = cgdInfoMapper.queryCgdInfoList(page,queryWrapper); IPage entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); entityPage.setRecords(BeanUtil.copyToList(list, CgdInfoEntity.class)); return entityPage;