完善关联查询的查询条件

This commit is contained in:
keyleaf 2021-05-26 10:49:09 +08:00
parent 485b05c263
commit c22e815bbe
8 changed files with 153 additions and 25 deletions

View File

@ -215,6 +215,10 @@ public class GenTable implements Serializable {
return isSub(this.tplCategory); return isSub(this.tplCategory);
} }
public boolean isJoin() {
return StrUtil.equals(GenConstants.TPL_JOIN, tplCategory);
}
public static boolean isSub(String tplCategory) { public static boolean isSub(String tplCategory) {
return tplCategory != null && StrUtil.equals(GenConstants.TPL_SUB, tplCategory); return tplCategory != null && StrUtil.equals(GenConstants.TPL_SUB, tplCategory);
} }

View File

@ -159,7 +159,9 @@ public class VelocityUtils
joinInfoMap.put("tableFkName", tableFkName); joinInfoMap.put("tableFkName", tableFkName);
GenTableColumn genTableColumn = genTableColumnMap.get(tableFkName); GenTableColumn genTableColumn = genTableColumnMap.get(tableFkName);
// 主表关联的字段(tableFkName)如果本身就在列表中展示就会在各个vm中生成拼接如果不需要在列表中展示关联查询却仍需要这个字段为避免重复生成增加该flag进行判断 // 主表关联的字段(tableFkName)如果本身就在列表中展示就会在各个vm中生成拼接如果不需要在列表中展示关联查询却仍需要这个字段为避免重复生成增加该flag进行判断
joinInfoMap.put("tableFkGenerateFlag", !genTableColumn.isList()); joinInfoMap.put("tableFkListFlag", !genTableColumn.isList());
// 主表关联的字段(tableFkName)如果本身就支持查询就会在各个vm中生成拼接如果不支持查询关联查询却仍需要这个字段为避免重复生成增加该flag进行判断
joinInfoMap.put("tableFkQueryFlag", !genTableColumn.isQuery());
joinInfoMap.put("tableFkColumn", genTableColumn); joinInfoMap.put("tableFkColumn", genTableColumn);
String joinField = joinInfo.getJoinField(); String joinField = joinInfo.getJoinField();
@ -177,18 +179,18 @@ public class VelocityUtils
for (String showField : showFields) { for (String showField : showFields) {
Map<String, String> showFieldMap = new HashMap<>(); Map<String, String> showFieldMap = new HashMap<>();
showFieldList.add(showFieldMap); showFieldList.add(showFieldMap);
String showFiledName = StrUtil.toCamelCase(showField); String showFieldName = StrUtil.toCamelCase(showField);
String showFiledUpperName = StrUtil.upperFirst(showFiledName); String showFieldUpperName = StrUtil.upperFirst(showFieldName);
showFieldMap.put("showField", showField); showFieldMap.put("showField", showField);
showFieldMap.put("showFiledName", showFiledName); showFieldMap.put("showFieldName", showFieldName);
showFieldMap.put("showFiledUpperName", showFiledUpperName); showFieldMap.put("showFieldUpperName", showFieldUpperName);
GenTableColumn column = columnMap.get(showField); GenTableColumn column = columnMap.get(showField);
showFieldMap.put("showFieldJavaType", column.getJavaType()); showFieldMap.put("showFieldJavaType", column.getJavaType());
showFieldMap.put("showFieldDictType", column.getDictType()); showFieldMap.put("showFieldDictType", column.getDictType());
if (StringUtils.isNotBlank(column.getColumnComment())) { if (StringUtils.isNotBlank(column.getColumnComment())) {
showFieldMap.put("showFieldComment", column.getColumnComment()); showFieldMap.put("showFieldComment", column.getColumnComment());
} else { } else {
showFieldMap.put("showFieldComment", joinTableLowerClassName + showFiledUpperName); showFieldMap.put("showFieldComment", joinTableLowerClassName + showFieldUpperName);
} }
} }
} }
@ -205,10 +207,15 @@ public class VelocityUtils
String queryFiledName = StrUtil.toCamelCase(queryField); String queryFiledName = StrUtil.toCamelCase(queryField);
String queryFiledUpperName = StrUtil.upperFirst(queryFiledName); String queryFiledUpperName = StrUtil.upperFirst(queryFiledName);
queryFieldMap.put("queryField", queryField); queryFieldMap.put("queryField", queryField);
queryFieldMap.put("queryFiledName", queryFiledName); queryFieldMap.put("queryFieldName", queryFiledName);
queryFieldMap.put("queryFiledUpperName", queryFiledUpperName); queryFieldMap.put("queryFieldUpperName", queryFiledUpperName);
GenTableColumn column = columnMap.get(queryField); GenTableColumn column = columnMap.get(queryField);
queryFieldMap.put("queryFieldHtmlType", column.getHtmlType());
queryFieldMap.put("queryFieldDictType", column.getDictType());
queryFieldMap.put("queryFieldJavaType", column.getJavaType());
queryFieldMap.put("queryFieldQueryType", column.getQueryType());
if (StringUtils.isNotBlank(column.getColumnComment())) { if (StringUtils.isNotBlank(column.getColumnComment())) {
queryFieldMap.put("queryFieldComment", column.getColumnComment()); queryFieldMap.put("queryFieldComment", column.getColumnComment());
} else { } else {

View File

@ -10,7 +10,7 @@ import java.util.Date;
#foreach ($import in $importList) #foreach ($import in $importList)
import ${import}; import ${import};
#end #end
#if($table.crud || $table.sub) #if($table.crud || $table.sub || $table.join)
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
#elseif($table.tree) #elseif($table.tree)
import com.ruoyi.common.core.domain.TreeEntity; import com.ruoyi.common.core.domain.TreeEntity;
@ -22,7 +22,7 @@ import com.ruoyi.common.core.domain.TreeEntity;
* @author ${author} * @author ${author}
* @date ${datetime} * @date ${datetime}
*/ */
#if($table.crud || $table.sub) #if($table.crud || $table.sub || $table.join)
#set($Entity="BaseEntity") #set($Entity="BaseEntity")
#elseif($table.tree) #elseif($table.tree)
#set($Entity="TreeEntity") #set($Entity="TreeEntity")
@ -58,4 +58,24 @@ public class ${ClassName}QueryBo extends ${Entity} {
#end #end
#end #end
#foreach ($joinInfo in $joinInfos)
#if(${joinInfo.tableFkQueryFlag})
// 补充主表字段
private ${joinInfo.tableFkColumn.javaType} ${joinInfo.tableFkColumn.javaField};
#end
#if($foreach.hasNext)
// 关联表 ${joinInfo.joinTableLowerClassName} 相关字段
#end
#foreach ($queryField in $joinInfo.queryFields)
/** $queryField.queryFieldComment */
#if($queryField.queryFieldJavaType == 'Date')
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
#end
@ApiModelProperty("$queryField.queryFieldComment")
private ${queryField.queryFieldJavaType} ${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName};
#end
#end
} }

View File

@ -2,15 +2,20 @@ package ${packageName}.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
#if($table.crud || $table.sub) #if($table.crud || $table.sub || $table.join)
import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.PageUtils;
import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.PagePlus;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
#end #end
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
#if($table.join)
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
#else
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
#end
import ${packageName}.bo.${ClassName}AddBo; import ${packageName}.bo.${ClassName}AddBo;
import ${packageName}.bo.${ClassName}QueryBo; import ${packageName}.bo.${ClassName}QueryBo;
import ${packageName}.bo.${ClassName}EditBo; import ${packageName}.bo.${ClassName}EditBo;
@ -37,7 +42,7 @@ public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${C
return getVoById(${pkColumn.javaField}, ${ClassName}Vo.class); return getVoById(${pkColumn.javaField}, ${ClassName}Vo.class);
} }
#if($table.crud || $table.sub) #if($table.crud || $table.sub || $table.join)
@Override @Override
public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}QueryBo bo) { public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}QueryBo bo) {
PagePlus<${ClassName}, ${ClassName}Vo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), ${ClassName}Vo.class); PagePlus<${ClassName}, ${ClassName}Vo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), ${ClassName}Vo.class);
@ -50,6 +55,31 @@ public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${C
return listVo(buildQueryWrapper(bo), ${ClassName}Vo.class); return listVo(buildQueryWrapper(bo), ${ClassName}Vo.class);
} }
#if($table.join)
private Wrapper<${ClassName}> buildQueryWrapper(${ClassName}QueryBo bo) {
Map<String, Object> params = bo.getParams();
QueryWrapper<${ClassName}> qw = new QueryWrapper();
#foreach ($joinInfo in $joinInfos)
#if($foreach.hasNext)
// 关联表 ${joinInfo.joinTableLowerClassName} 相关字段
#end
#foreach ($queryField in $joinInfo.queryFields)
#if(${queryField.queryFieldQueryType} != 'BETWEEN')
#if(${queryField.queryFieldJavaType} == 'String')
#set($condition='StrUtil.isNotBlank(bo.get'+${joinInfo.joinTableUpperClassName}+${queryField.queryFieldUpperName}+'())')
#else
#set($condition='bo.get'+${joinInfo.joinTableUpperClassName}+${queryField.queryFieldUpperName}+'() != null')
#end
qw.${queryField.queryFieldQueryType.toLowerCase()}($condition, "${joinInfo.joinTable}.${queryField.queryField}", bo.get${joinInfo.joinTableUpperClassName}${queryField.queryFieldUpperName}());
#else
qw.between(params.get("begin${queryField.queryFieldUpperName}") != null && params.get("end${queryField.queryFieldUpperName}") != null,
"${joinInfo.joinTable}.${joinInfo.joinField}" ,params.get("begin${queryField.queryFieldUpperName}"), params.get("end${queryField.queryFieldUpperName}"));
#end
#end
#end
return qw;
}
#else
private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}QueryBo bo) { private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}QueryBo bo) {
Map<String, Object> params = bo.getParams(); Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery();
@ -76,6 +106,7 @@ public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${C
#end #end
return lqw; return lqw;
} }
#end
@Override @Override
public Boolean insertByAddBo(${ClassName}AddBo bo) { public Boolean insertByAddBo(${ClassName}AddBo bo) {

View File

@ -50,12 +50,13 @@ public class ${ClassName}Vo {
#end #end
#foreach ($joinInfo in $joinInfos) #foreach ($joinInfo in $joinInfos)
#if(${joinInfo.tableFkGenerateFlag}) #if(${joinInfo.tableFkListFlag})
// 补充主表字段 // 补充主表字段
private ${joinInfo.tableFkColumn.javaType} ${joinInfo.tableFkColumn.javaField}; private ${joinInfo.tableFkColumn.javaType} ${joinInfo.tableFkColumn.javaField};
#end #end
// 关联表 ${joinInfo.joinTableLowerClassName} 字段 // 关联表 ${joinInfo.joinTableLowerClassName} 字段
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
/** $showField.showFieldComment */
#if($showField.showFieldJavaType == 'Date') #if($showField.showFieldJavaType == 'Date')
@Excel(name = "${showField.showFieldComment}" , width = 30, dateFormat = "yyyy-MM-dd") @Excel(name = "${showField.showFieldComment}" , width = 30, dateFormat = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

View File

@ -62,6 +62,61 @@
</el-form-item> </el-form-item>
#end #end
#end #end
#end
#foreach($joinInfo in $joinInfos)
#foreach($queryField in $joinInfo.queryFields)
#if($queryField.queryFieldHtmlType == "input")
<el-form-item label="${queryField.queryFieldComment}" prop="${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}">
<el-input
v-model="queryParams.${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}"
placeholder="请输入${queryField.queryFieldComment}"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
#elseif(($queryField.queryFieldHtmlType == "select" || $queryField.queryFieldHtmlType == "radio") && "" != $queryField.queryFieldDictType)
<el-form-item label="${queryField.queryFieldComment}" prop="${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}">
<el-select v-model="queryParams.${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}" placeholder="请选择${queryField.queryFieldComment}" clearable size="small">
<el-option
v-for="dict in ${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}Options"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
#elseif(($queryField.queryFieldHtmlType == "select" || $queryField.queryFieldHtmlType == "radio") && $queryField.queryFieldDictType)
<el-form-item label="${queryField.queryFieldComment}" prop="${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}">
<el-select v-model="queryParams.${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}" placeholder="请选择${queryField.queryFieldComment}" clearable size="small">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
#elseif($queryField.queryFieldHtmlType == "datetime" && $queryField.queryFieldQueryType != "BETWEEN")
<el-form-item label="${queryField.queryFieldComment}" prop="${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}">
<el-date-picker clearable size="small"
v-model="queryParams.${joinInfo.joinTableLowerClassName}${queryField.queryFieldUpperName}"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择${queryField.queryFieldComment}">
</el-date-picker>
</el-form-item>
#elseif($queryField.queryFieldHtmlType == "datetime" && $queryField.queryFieldQueryType == "BETWEEN")
<el-form-item label="${queryField.queryFieldComment}">
<el-date-picker
v-model="daterange${queryField.queryFieldUpperName}"
size="small"
style="width: 240px"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
#end
#end
#end #end
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -143,9 +198,9 @@
<!-- 关联表 ${joinInfo.joinTableLowerClassName} 字段 --> <!-- 关联表 ${joinInfo.joinTableLowerClassName} 字段 -->
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
#if($showField.showFieldDictType && "" != $showField.showFieldDictType) #if($showField.showFieldDictType && "" != $showField.showFieldDictType)
<el-table-column label="${showField.showFieldComment}" align="center" prop="${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}" :formatter="${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}Format" /> <el-table-column label="${showField.showFieldComment}" align="center" prop="${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}" :formatter="${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}Format" />
#else #else
<el-table-column label="${showField.showFieldComment}" align="center" prop="${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}" /> <el-table-column label="${showField.showFieldComment}" align="center" prop="${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}" />
#end #end
#end #end
#end #end
@ -195,7 +250,7 @@
<el-option <el-option
v-for="item in ${joinInfo.joinTableLowerClassName}Options" v-for="item in ${joinInfo.joinTableLowerClassName}Options"
:key="item.${joinInfo.joinGenTable.pkColumn.javaField}" :key="item.${joinInfo.joinGenTable.pkColumn.javaField}"
:label="item.${joinInfo.showFields.get(0).showFiledName}" :label="item.${joinInfo.showFields.get(0).showFieldName}"
:value="item.${joinInfo.joinGenTable.pkColumn.javaField}" :value="item.${joinInfo.joinGenTable.pkColumn.javaField}"
/> />
</el-select> </el-select>
@ -437,8 +492,8 @@ export default {
#foreach($joinInfo in $joinInfos) #foreach($joinInfo in $joinInfos)
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
#if($showField.showFieldDictType && "" != $showField.showFieldDictType) #if($showField.showFieldDictType && "" != $showField.showFieldDictType)
// $comment字典 // ${showField.showFieldComment}字典
${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}Options: [], ${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}Options: [],
#end #end
#end #end
#end #end
@ -488,7 +543,7 @@ export default {
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
#if($showField.showFieldDictType && "" != $showField.showFieldDictType) #if($showField.showFieldDictType && "" != $showField.showFieldDictType)
this.getDicts("${showField.showFieldDictType}").then(response => { this.getDicts("${showField.showFieldDictType}").then(response => {
this.${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}Options = response.data; this.${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}Options = response.data;
}); });
#end #end
#end #end
@ -525,7 +580,7 @@ export default {
list${joinInfo.joinGenTableBusinessName}({ list${joinInfo.joinGenTableBusinessName}({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
${joinInfo.showFields.get(0).showFiledName}: keyword ${joinInfo.showFields.get(0).showFieldName}: keyword
}).then(response => { }).then(response => {
that.${joinInfo.joinGenTable.moduleName}${joinInfo.joinGenTableBusinessName}Options = response.rows that.${joinInfo.joinGenTable.moduleName}${joinInfo.joinGenTableBusinessName}Options = response.rows
}); });
@ -549,8 +604,8 @@ export default {
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
#if($showField.showFieldDictType && "" != $showField.showFieldDictType) #if($showField.showFieldDictType && "" != $showField.showFieldDictType)
// $comment字典翻译 // $comment字典翻译
${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}Format(row, column) { ${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}Format(row, column) {
return this.selectDictLabel#if($column.htmlType == "checkbox")s#end(this.${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}Options, row.${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}); return this.selectDictLabel#if($column.htmlType == "checkbox")s#end(this.${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}Options, row.${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName});
}, },
#end #end
#end #end

View File

@ -15,7 +15,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#foreach ($joinInfo in $joinInfos) #foreach ($joinInfo in $joinInfos)
<!-- ${joinInfo.joinTableLowerClassName} --> <!-- ${joinInfo.joinTableLowerClassName} -->
#foreach ($showField in $joinInfo.showFields) #foreach ($showField in $joinInfo.showFields)
<result property="${joinInfo.joinTableLowerClassName}${showField.showFiledUpperName}" column="${joinInfo.joinTable}_${showField.showField}"/> <result property="${joinInfo.joinTableLowerClassName}${showField.showFieldUpperName}" column="${joinInfo.joinTable}_${showField.showField}"/>
#end #end
#end #end
</resultMap> </resultMap>

View File

@ -263,9 +263,14 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="子表展示字段"
min-width="100" min-width="100"
> >
<template slot="header" slot-scope="scope">
子表展示字段
<el-tooltip content="展示字段的第一个字段将作为表单录入页面中关联表下拉框远程搜索的搜索条件。例如通过输入用户名搜索用户列表从而填充主表的userId。" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.showFields" multiple placeholder="请选择" style="width:100%"> <el-select v-model="scope.row.showFields" multiple placeholder="请选择" style="width:100%">
<el-option <el-option
@ -278,9 +283,14 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="列表查询条件(尚未完成)"
min-width="100" min-width="100"
> >
<template slot="header" slot-scope="scope">
列表查询条件
<el-tooltip content="列表查询上方的查询条件,查询方式同原表配置。" placement="top">
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-select v-model="scope.row.queryFields" multiple placeholder="请选择" style="width:100%"> <el-select v-model="scope.row.queryFields" multiple placeholder="请选择" style="width:100%">
<el-option <el-option