优化接口
This commit is contained in:
parent
ad7489a99b
commit
08790c3bf0
|
|
@ -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 <T> QueryWrapper<T> initQueryWrapper(String columnPrefix,T searchObj,Map<String, String[]> parameterMap){
|
||||
long start = System.currentTimeMillis();
|
||||
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
|
||||
installMplus(queryWrapper, columnPrefix, searchObj, parameterMap);
|
||||
log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----");
|
||||
return queryWrapper;
|
||||
}
|
||||
/**
|
||||
* 组装Mybatis Plus 查询条件
|
||||
* <p>使用此方法 需要有如下几点注意:
|
||||
* <br>1.使用QueryWrapper 而非LambdaQueryWrapper;
|
||||
* <br>2.实例化QueryWrapper时不可将实体传入参数
|
||||
* <br>错误示例:如QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(jeecgDemo);
|
||||
* <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
|
||||
* <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
|
||||
*/
|
||||
private static void installMplus(QueryWrapper<?> queryWrapper,String columnPrefix,Object searchObj,Map<String, String[]> 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<String,SysPermissionDataRuleModel> 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<String,String> 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<vals.length;k++) {
|
||||
j = j.or().like(field,vals[k]);
|
||||
log.info("---查询过滤器,Query规则 .or()---field:{}, rule:{}, value:{}", field, "like", vals[k]);
|
||||
}
|
||||
//return j;
|
||||
});
|
||||
}else {
|
||||
log.info("---查询过滤器,Query规则---field:{}, rule:{}, value:{}", field, "like", vals[0]);
|
||||
queryWrapper.and(j -> 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<Field> allFields = getClassFields(clazz);
|
||||
List<Field> 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<Field> getClassFields(Class<?> clazz) {
|
||||
List<Field> list = new ArrayList<Field>();
|
||||
Field[] fields;
|
||||
do{
|
||||
fields = clazz.getDeclaredFields();
|
||||
for(int i = 0;i<fields.length;i++){
|
||||
list.add(fields[i]);
|
||||
}
|
||||
clazz = clazz.getSuperclass();
|
||||
}while(clazz!= Object.class&&clazz!=null);
|
||||
return list;
|
||||
}
|
||||
/**
|
||||
* 组装Mybatis Plus 查询条件
|
||||
* <p>使用此方法 需要有如下几点注意:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,11 +35,17 @@
|
|||
</select>
|
||||
|
||||
<select id="queryWlInfoByWlId" resultType="com.nu.modules.ConfigMaterial.entity.ConfigMaterialInfo">
|
||||
select a.*,b.kcsl,c.item_text as izYbbxName,d.item_text as izJgyhName,e.item_text as izEnabledName from nu_config_material_info a
|
||||
select a.*,b.kcsl,c.item_text as izYbbxName,d.item_text as izJgyhName,e.item_text as izEnabledName ,f.category_name,g.type_name,h.medication_name,tag.item_text as tagName
|
||||
from nu_config_material_info a
|
||||
left join nu_warehouse_material_info b on a.id = b.wl_id and b.nu_id = #{nuId}
|
||||
left join sys_dict_item c on a.iz_ybbx = c.item_value and c.dict_id = 'a7adbcd86c37f7dbc9b66945c82ef9e6'
|
||||
left join sys_dict_item d on a.iz_jgyh = d.item_value and d.dict_id = 'a7adbcd86c37f7dbc9b66945c82ef9e6'
|
||||
left join sys_dict_item e on a.iz_enabled = e.item_value and e.dict_id = '1900072409995653121'
|
||||
|
||||
left join nu_config_material_category f on a.category_id = f.id
|
||||
left join nu_config_material_type g on a.type_id = g.id
|
||||
left join nu_config_material_medication h on a.medication_id = h.id
|
||||
left join sys_dict_item tag on a.tag_type = tag.item_value and tag.dict_id = '1978662656563613698'
|
||||
where a.id = #{wlId}
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<NuInvoicingCgdInfo> {
|
||||
|
||||
List<NuInvoicingCgdInfo> queryCgdInfoList(Page<NuInvoicingCgdInfo> page, @Param(Constants.WRAPPER) QueryWrapper<NuInvoicingCgdInfo> queryWrapper);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,4 +2,10 @@
|
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.nu.modules.cgd.mapper.NuInvoicingCgdInfoMapper">
|
||||
|
||||
<select id="queryCgdInfoList" resultType="com.nu.modules.cgd.entity.NuInvoicingCgdInfo">
|
||||
select a.*,b.material_img,b.tag_type,c.item_text as tagName from nu_invoicing_cgd_info a
|
||||
left join nu_config_material_info b on a.wl_id = b.id
|
||||
left join sys_dict_item c on b.tag_type = c.item_value and c.dict_id = '1978662656563613698'
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -376,10 +376,9 @@ public class NuInvoicingCgdMainServiceImpl extends ServiceImpl<NuInvoicingCgdMai
|
|||
public IPage<CgdInfoEntity> queryCgdInfoList(Integer pageNo, Integer pageSize, CgdInfoEntity cgdInfoEntityDto, HttpServletRequest req) {
|
||||
NuInvoicingCgdInfo nuInvoicingCgdInfo = new NuInvoicingCgdInfo();
|
||||
BeanUtils.copyProperties(cgdInfoEntityDto,nuInvoicingCgdInfo);
|
||||
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
|
||||
QueryWrapper<NuInvoicingCgdInfo> queryWrapper = QueryGenerator.initQueryWrapper(nuInvoicingCgdInfo, req.getParameterMap(), customeRuleMap);
|
||||
QueryWrapper<NuInvoicingCgdInfo> queryWrapper = QueryGenerator.initQueryWrapper("a",nuInvoicingCgdInfo, req.getParameterMap());
|
||||
Page<NuInvoicingCgdInfo> page = new Page<>(pageNo, pageSize);
|
||||
List<NuInvoicingCgdInfo> list = cgdInfoMapper.selectList(page,queryWrapper);
|
||||
List<NuInvoicingCgdInfo> list = cgdInfoMapper.queryCgdInfoList(page,queryWrapper);
|
||||
IPage<CgdInfoEntity> entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
|
||||
entityPage.setRecords(BeanUtil.copyToList(list, CgdInfoEntity.class));
|
||||
return entityPage;
|
||||
|
|
|
|||
Loading…
Reference in New Issue