springboot封装统一查询对象进行多条件查询案例(mybatis和mybatis-plus+反射两种版本)
文章目录mybatis版本:通用查询接口封装辅助查询类:通用controller:自定义注解controller service mapper测试mybatis-plus实现版本entity自定义注解controllerservice界面:mybatis版本:通用查询接口功能:1、单条查询 2、分页+搜索 3、查询数量public interface ICommonQuery {/*** 根据id
文章目录
界面:
mybatis版本:
通用查询接口
- 功能:1、单条查询 2、分页+搜索 3、查询数量
public interface ICommonQuery {
/**
* 根据id查询明细。
*
* @param id 资源id
* @return 资源
*/
Object selectOne(Long id) throws Exception;
/**
* 自定义查询
*
* @param parameterMap 查询参数
* @return 查询结果
*/
List<?> select(Map<String, String> parameterMap) throws Exception;
/**
* 查询数量
*
* @param parameterMap 查询参数
* @return 查询结果
*/
Long counts(Map<String, String> parameterMap) throws Exception;
/**
* 新增数据
*
* @param obj
* @return
*/
int insert(JSONObject obj, HttpServletRequest request) throws Exception;
/**
* 更新数据
*
* @param obj
* @return
*/
int update(JSONObject obj, HttpServletRequest request) throws Exception;
/**
* 删除数据
*
* @param id
* @return
*/
int delete(Long id, HttpServletRequest request) throws Exception;
/**
* 批量删除数据
*
* @param ids
* @return
*/
int deleteBatch(String ids, HttpServletRequest request) throws Exception;
/**
* 查询名称是否存在
*
* @param id
* @return
*/
int checkIsNameExist(Long id, String name) throws Exception;
}
封装辅助查询类:
@Service
public class CommonQueryManager {
@Resource
private InterfaceContainer container;
/**
* 查询单条
*
* @param apiName 接口名称
* @param id ID
*/
public Object selectOne(String apiName, Long id) throws Exception {
if (StringUtil.isNotEmpty(apiName) && id!=null) {
return container.getCommonQuery(apiName).selectOne(id);
}
return null;
}
/**
* 查询
* @param apiName
* @param parameterMap
* @return
*/
public List<?> select(String apiName, Map<String, String> parameterMap)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).select(parameterMap);
}
return new ArrayList<Object>();
}
/**
* 计数
* @param apiName
* @param parameterMap
* @return
*/
public Long counts(String apiName, Map<String, String> parameterMap)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).counts(parameterMap);
}
return BusinessConstants.DEFAULT_LIST_NULL_NUMBER;
}
/**
* 插入
* @param apiName
* @param obj
* @return
*/
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public int insert(String apiName, JSONObject obj, HttpServletRequest request) throws Exception{
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).insert(obj, request);
}
return 0;
}
/**
* 更新
* @param apiName
* @param obj
* @return
*/
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public int update(String apiName, JSONObject obj, HttpServletRequest request)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).update(obj, request);
}
return 0;
}
/**
* 删除
* @param apiName
* @param id
* @return
*/
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public int delete(String apiName, Long id, HttpServletRequest request)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).delete(id, request);
}
return 0;
}
/**
* 批量删除
* @param apiName
* @param ids
* @return
*/
@Transactional(value = "transactionManager", rollbackFor = Exception.class)
public int deleteBatch(String apiName, String ids, HttpServletRequest request)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).deleteBatch(ids, request);
}
return 0;
}
/**
* 判断是否存在
* @param apiName
* @param id
* @param name
* @return
*/
public int checkIsNameExist(String apiName, Long id, String name) throws Exception{
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).checkIsNameExist(id, name);
}
return 0;
}
}
CommonQueryManager中的成员变量InterfaceContainer类:
@Service
public class InterfaceContainer {
private final Map<String, ICommonQuery> configComponentMap = new HashMap<>();
@Autowired(required = false)
private synchronized void init(ICommonQuery[] configComponents) {
for (ICommonQuery configComponent : configComponents) {
ResourceInfo info = AnnotationUtils.getAnnotation(configComponent, ResourceInfo.class);
if (info != null) {
configComponentMap.put(info.value(), configComponent);
}
}
}
public ICommonQuery getCommonQuery(String apiName) {
return configComponentMap.get(apiName);
}
}
通过
public List<?> select(String apiName, Map<String, String> parameterMap)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).select(parameterMap);
}
return new ArrayList<Object>();
}
来对不同接口进行分别查询
通过
public Long counts(String apiName, Map<String, String> parameterMap)throws Exception {
if (StringUtil.isNotEmpty(apiName)) {
return container.getCommonQuery(apiName).counts(parameterMap);
}
return BusinessConstants.DEFAULT_LIST_NULL_NUMBER;
}
来对某一个接口进行条件查询,其中parameterMap是自己传入的参数:
验证:
在上面的方法中加上
parameterMap.entrySet().forEach(e->{
log.info(e.getKey()+":"+e.getValue());
});
搜索框输入:
控制台:
输入:
控制台:
通用controller:
@RestController
public class ResourceController {
@Resource
private CommonQueryManager configResourceManager;
@GetMapping(value = "/{apiName}/info")
public String getList(@PathVariable("apiName") String apiName,
@RequestParam("id") Long id,
HttpServletRequest request) throws Exception {
Object obj = configResourceManager.selectOne(apiName, id);
Map<String, Object> objectMap = new HashMap<String, Object>();
if(obj != null) {
objectMap.put("info", obj);
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else {
return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
}
}
@GetMapping(value = "/{apiName}/list")
public String getList(@PathVariable("apiName") String apiName,
@RequestParam(value = Constants.PAGE_SIZE, required = false) Integer pageSize,
@RequestParam(value = Constants.CURRENT_PAGE, required = false) Integer currentPage,
@RequestParam(value = Constants.SEARCH, required = false) String search,
HttpServletRequest request)throws Exception {
Map<String, String> parameterMap = ParamUtils.requestToMap(request);
parameterMap.put(Constants.SEARCH, search);
Map<String, Object> objectMap = new HashMap<String, Object>();
if (pageSize != null && pageSize <= 0) {
pageSize = 10;
}
String offset = ParamUtils.getPageOffset(currentPage, pageSize);
if (StringUtil.isNotEmpty(offset)) {
parameterMap.put(Constants.OFFSET, offset);
}
List<?> list = configResourceManager.select(apiName, parameterMap);
if (list != null) {
System.out.println("访问接口:"+apiName);
objectMap.put("total", configResourceManager.counts(apiName, parameterMap));
objectMap.put("rows", list);
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else {
objectMap.put("total", BusinessConstants.DEFAULT_LIST_NULL_NUMBER);
objectMap.put("rows", new ArrayList<Object>());
return returnJson(objectMap, "查找不到数据", ErpInfo.OK.code);
}
}
@PostMapping(value = "/{apiName}/add", produces = {"application/javascript", "application/json"})
public String addResource(@PathVariable("apiName") String apiName,
@RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
Map<String, Object> objectMap = new HashMap<String, Object>();
int insert = configResourceManager.insert(apiName, obj, request);
if(insert > 0) {
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else if(insert == -1) {
return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
} else {
return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
}
}
@PutMapping(value = "/{apiName}/update", produces = {"application/javascript", "application/json"})
public String updateResource(@PathVariable("apiName") String apiName,
@RequestBody JSONObject obj, HttpServletRequest request)throws Exception {
Map<String, Object> objectMap = new HashMap<String, Object>();
int update = configResourceManager.update(apiName, obj, request);
if(update > 0) {
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else if(update == -1) {
return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
} else {
return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
}
}
@DeleteMapping(value = "/{apiName}/delete", produces = {"application/javascript", "application/json"})
public String deleteResource(@PathVariable("apiName") String apiName,
@RequestParam("id") Long id, HttpServletRequest request)throws Exception {
Map<String, Object> objectMap = new HashMap<String, Object>();
int delete = configResourceManager.delete(apiName, id, request);
if(delete > 0) {
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else if(delete == -1) {
return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
} else {
return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
}
}
@DeleteMapping(value = "/{apiName}/deleteBatch", produces = {"application/javascript", "application/json"})
public String batchDeleteResource(@PathVariable("apiName") String apiName,
@RequestParam("ids") String ids, HttpServletRequest request)throws Exception {
Map<String, Object> objectMap = new HashMap<String, Object>();
int delete = configResourceManager.deleteBatch(apiName, ids, request);
if(delete > 0) {
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
} else if(delete == -1) {
return returnJson(objectMap, ErpInfo.TEST_USER.name, ErpInfo.TEST_USER.code);
} else {
return returnJson(objectMap, ErpInfo.ERROR.name, ErpInfo.ERROR.code);
}
}
@GetMapping(value = "/{apiName}/checkIsNameExist")
public String checkIsNameExist(@PathVariable("apiName") String apiName,
@RequestParam Long id, @RequestParam(value ="name", required = false) String name,
HttpServletRequest request)throws Exception {
Map<String, Object> objectMap = new HashMap<String, Object>();
int exist = configResourceManager.checkIsNameExist(apiName, id, name);
if(exist > 0) {
objectMap.put("status", true);
} else {
objectMap.put("status", false);
}
return returnJson(objectMap, ErpInfo.OK.name, ErpInfo.OK.code);
}
}
自定义注解
表示可以用于条件查询的字段
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface ResourceInfo {
String value();
}
controller service mapper测试
下面以账单为例:
对一个entity写两个类一个自定义注解:
AccountHeadComponent 拓展ICommonQuery接口:
@Service(value = "accountHead_component")
@AccountHeadResource
public class AccountHeadComponent implements ICommonQuery {
//其他方法忽略
private List<?> getAccountHeadList(Map<String, String> map)throws Exception {
String search = map.get(Constants.SEARCH);
String type = StringUtil.getInfo(search, "type");
String roleType = StringUtil.getInfo(search, "roleType");
String billNo = StringUtil.getInfo(search, "billNo");
String beginTime = StringUtil.getInfo(search, "beginTime");
String endTime = StringUtil.getInfo(search, "endTime");
Long organId = StringUtil.parseStrLong(StringUtil.getInfo(search, "organId"));
Long creator = StringUtil.parseStrLong(StringUtil.getInfo(search, "creator"));
Long handsPersonId = StringUtil.parseStrLong(StringUtil.getInfo(search, "handsPersonId"));
return accountHeadService.select(type, roleType, billNo, beginTime, endTime, organId, creator, handsPersonId, QueryUtils.offset(map), QueryUtils.rows(map));
}
}
}
@GetMapping(value = "/getStatistics")
public BaseResponseInfo getStatistics(@RequestParam("name") String name,
@RequestParam("serialNo") String serialNo,
HttpServletRequest request) throws Exception {
BaseResponseInfo res = new BaseResponseInfo();
try {
Map<String, Object> map = accountService.getStatistics(name, serialNo);
res.code = 200;
res.data = map;
} catch(Exception e){
e.printStackTrace();
res.code = 500;
res.data = "获取数据失败";
}
return res;
}
service:
@Service
public class AccountHeadService {
private Logger logger = LoggerFactory.getLogger(AccountHeadService.class);
@Resource
private AccountHeadMapper accountHeadMapper;
@Resource
private AccountHeadMapperEx accountHeadMapperEx;
@Resource
private OrgaUserRelService orgaUserRelService;
@Resource
private AccountItemService accountItemService;
@Resource
private SupplierService supplierService;
@Resource
private LogService logService;
@Resource
private AccountItemMapperEx accountItemMapperEx;
//对应 CommonQueryManager的 public List<?> select(String apiName, Map<String, String> parameterMap)throws Exception {
// if (StringUtil.isNotEmpty(apiName)) {
// return container.getCommonQuery(apiName).select(parameterMap);
// }
// return new ArrayList<Object>();
// }
public List<AccountHeadVo4ListEx> select(String type, String roleType, String billNo, String beginTime, String endTime,
Long organId, Long creator, Long handsPersonId, int offset, int rows) throws Exception{
List<AccountHeadVo4ListEx> resList = new ArrayList<>();
try{
String [] creatorArray = getCreatorArray(roleType);
beginTime = Tools.parseDayToTime(beginTime,BusinessConstants.DAY_FIRST_TIME);
endTime = Tools.parseDayToTime(endTime,BusinessConstants.DAY_LAST_TIME);
List<AccountHeadVo4ListEx> list = accountHeadMapperEx.selectByConditionAccountHead(type, creatorArray, billNo, beginTime, endTime, organId, creator, handsPersonId, offset, rows);
if (null != list) {
for (AccountHeadVo4ListEx ah : list) {
if(ah.getChangeAmount() != null) {
ah.setChangeAmount(ah.getChangeAmount().abs());
}
if(ah.getTotalPrice() != null) {
ah.setTotalPrice(ah.getTotalPrice().abs());
}
if(ah.getBillTime() !=null) {
ah.setBillTimeStr(getCenternTime(ah.getBillTime()));
}
resList.add(ah);
}
}
}catch(Exception e){
JshException.readFail(logger, e);
}
return resList;
}
//忽略其他增删改的方法
mapper:
public interface AccountHeadMapperEx {
List<AccountHeadVo4ListEx> selectByConditionAccountHead(
@Param("type") String type,
@Param("creatorArray") String[] creatorArray,
@Param("billNo") String billNo,
@Param("beginTime") String beginTime,
@Param("endTime") String endTime,
@Param("organId") Long organId,
@Param("creator") Long creator,
@Param("handsPersonId") Long handsPersonId,
@Param("offset") Integer offset,
@Param("rows") Integer rows);
//省略其他方法
}
连接另外的几个表取出需要查询的字段进行条件查询:
<select id="selectByConditionAccountHead" parameterType="com.jsh.erp.datasource.entities.AccountHeadExample" resultMap="ResultMapEx">
select ah.*, s.supplier OrganName, p.Name HandsPersonName, u.username userName, a.Name AccountName
from jsh_account_head ah
left join jsh_supplier s on ah.organ_id=s.id and ifnull(s.delete_Flag,'0') !='1'
left join jsh_user u on ah.creator=u.id and ifnull(u.Status,'0') ='0'
left join jsh_person p on ah.hands_person_id=p.id and ifnull(p.delete_Flag,'0') !='1'
left join jsh_account a on ah.account_id=a.id and ifnull(a.delete_Flag,'0') !='1'
where 1=1
<if test="billNo != null">
<bind name="bindBillNo" value="'%'+billNo+'%'"/>
and ah.bill_no like #{bindBillNo}
</if>
<if test="type != null">
and ah.type=#{type}
</if>
<if test="beginTime != null">
and ah.bill_time >= #{beginTime}
</if>
<if test="endTime != null">
and ah.bill_time <= #{endTime}
</if>
<if test="organId != null">
and ah.organ_id=#{organId}
</if>
<if test="handsPersonId != null">
and ah.hands_person_id=#{handsPersonId}
</if>
<if test="creator != null">
and ah.creator=#{creator}
</if>
<if test="creatorArray != null">
and ah.creator in (
<foreach collection="creatorArray" item="creator" separator=",">
#{creator}
</foreach>
)
</if>
and ifnull(ah.delete_flag,'0') !='1'
order by ah.id desc
<if test="offset != null and rows != null">
limit #{offset},#{rows}
</if>
</select>
当点击不同的选项时执行不同的sql:
Execute SQL:SELECT COUNT(id) FROM jsh_account_head WHERE jsh_account_head.tenant_id = 63 AND 1 = 1 AND type = ‘付款’ AND ifnull(delete_flag, ‘0’) != ‘1’
Execute SQL:SELECT COUNT(id) FROM jsh_account_head WHERE jsh_account_head.tenant_id = 63 AND 1 = 1 AND type = ‘转账’ AND ifnull(delete_flag, ‘0’) != ‘1’
mybatis-plus实现版本
entity
对每一个entity都定义一个查询类:
@Data
public class DeptDto implements Serializable {
/** ID */
private Long id;
/** 名称 */
private String name;
/** 上级部门 */
private Long pid;
/** 状态 */
private Boolean enabled;
private List<DeptDto> children;
/** 创建日期 */
private Timestamp createTime;
public String getLabel() {
return name;
}
}
@Data
public class DeptQueryCriteria {
@Query(type = Query.Type.IN, propName = "id")
private Set<Long> ids;
@Query(type = Query.Type.INNER_LIKE)
private String name;
@Query
private Boolean enabled;
@Query
private Long pid;
@Query(type = Query.Type.BETWEEN)
private List<Timestamp> createTime;
}
自定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Query {
// Dong ZhaoYang 2017/8/7 基本对象的属性名
String propName() default "";
// Dong ZhaoYang 2017/8/7 查询方式
Type type() default Type.EQUAL;
/**
* 多字段模糊搜索,仅支持String类型字段,多个用逗号隔开, 如@Query(blurry = "email,username")
*/
String blurry() default "";
enum Type {
// jie 2019/6/4 相等
EQUAL
// Dong ZhaoYang 2017/8/7 大于等于
, GREATER_THAN
// Dong ZhaoYang 2017/8/7 小于等于
, LESS_THAN
// Dong ZhaoYang 2017/8/7 中模糊查询
, INNER_LIKE
// Dong ZhaoYang 2017/8/7 左模糊查询
, LEFT_LIKE
// Dong ZhaoYang 2017/8/7 右模糊查询
, RIGHT_LIKE
// Dong ZhaoYang 2017/8/7 小于
, LESS_THAN_NQ
// jie 2019/6/4 包含
, IN
// 不等于
, NOT_EQUAL
// between
, BETWEEN
// 不为空
, NOT_NULL
// 查询时间
, UNIX_TIMESTAMP
}
}
自定义辅助查询类(利用反射)
package co.yixiang.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import co.yixiang.annotation.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @author Zheng Jie
* @date 2019-6-4 14:59:48
*/
@Slf4j
@SuppressWarnings({"unchecked", "all"})
public class QueryHelpPlus {
public static <R, Q> QueryWrapper getPredicate(R obj, Q query) {
QueryWrapper<R> queryWrapper = new QueryWrapper<R>();
if (query == null) {
return queryWrapper;
}
try {
List<Field> fields = getAllFields(query.getClass(), new ArrayList<>());
for (Field field : fields) {
boolean accessible = field.isAccessible();
field.setAccessible(true);
Query q = field.getAnnotation(Query.class);
if (q != null) {
String propName = q.propName();
String blurry = q.blurry();
String attributeName = isBlank(propName) ? field.getName() : propName;
attributeName = humpToUnderline(attributeName);
Class<?> fieldType = field.getType();
Object val = field.get(query);
if (ObjectUtil.isNull(val) || "".equals(val)) {
continue;
}
// 模糊多字段
if (ObjectUtil.isNotEmpty(blurry)) {
String[] blurrys = blurry.split(",");
//queryWrapper.or();
queryWrapper.and(wrapper -> {
for (int i = 0; i < blurrys.length; i++) {
String column = humpToUnderline(blurrys[i]);
//if(i!=0){
wrapper.or();
//}
wrapper.like(column, val.toString());
}
});
continue;
}
String finalAttributeName = attributeName;
switch (q.type()) {
case EQUAL:
//queryWrapper.and(wrapper -> wrapper.eq(finalAttributeName, val));
queryWrapper.eq(attributeName, val);
break;
case GREATER_THAN:
queryWrapper.ge(finalAttributeName, val);
break;
case LESS_THAN:
queryWrapper.le(finalAttributeName, val);
break;
case LESS_THAN_NQ:
queryWrapper.lt(finalAttributeName, val);
break;
case INNER_LIKE:
queryWrapper.like(finalAttributeName, val);
break;
case LEFT_LIKE:
queryWrapper.likeLeft(finalAttributeName, val);
break;
case RIGHT_LIKE:
queryWrapper.likeRight(finalAttributeName, val);
break;
case IN:
if (CollUtil.isNotEmpty((Collection<Long>) val)) {
queryWrapper.in(finalAttributeName, (Collection<Long>) val);
}
break;
case NOT_EQUAL:
queryWrapper.ne(finalAttributeName, val);
break;
case NOT_NULL:
queryWrapper.isNotNull(finalAttributeName);
break;
case BETWEEN:
List<Object> between = new ArrayList<>((List<Object>) val);
queryWrapper.between(finalAttributeName, between.get(0), between.get(1));
break;
case UNIX_TIMESTAMP:
List<Object> UNIX_TIMESTAMP = new ArrayList<>((List<Object>) val);
if (!UNIX_TIMESTAMP.isEmpty()) {
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long time1 = fm.parse(UNIX_TIMESTAMP.get(0).toString()).getTime() / 1000;
long time2 = fm.parse(UNIX_TIMESTAMP.get(1).toString()).getTime() / 1000;
queryWrapper.between(finalAttributeName, time1, time2);
}
break;
default:
break;
}
}
field.setAccessible(accessible);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return queryWrapper;
}
private static boolean isBlank(final CharSequence cs) {
int strLen;
if (cs == null || (strLen = cs.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
private static List<Field> getAllFields(Class clazz, List<Field> fields) {
if (clazz != null) {
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
getAllFields(clazz.getSuperclass(), fields);
}
return fields;
}
/***
* 驼峰命名转为下划线命名
*
* @param para
* 驼峰命名的字符串
*/
public static String humpToUnderline(String para) {
StringBuilder sb = new StringBuilder(para);
int temp = 0;//定位
if (!para.contains("_")) {
for (int i = 0; i < para.length(); i++) {
if (Character.isUpperCase(para.charAt(i))) {
sb.insert(i + temp, "_");
temp += 1;
}
}
}
return sb.toString();
}
}
controller
@Log("查询部门")
@ApiOperation("查询部门")
@GetMapping("/dept")
public ResponseEntity<Object> getDepts(DeptQueryCriteria criteria) {
// 数据权限
criteria.setIds(dataScope.getDeptIds());
List<DeptDto> deptDtos = generator.convert(deptService.queryAll(criteria), DeptDto.class);
return new ResponseEntity<>(deptService.buildTree(deptDtos), HttpStatus.OK);
}
service
List<Dept> queryAll(DeptQueryCriteria criteria);
@Service
@AllArgsConstructor
//@CacheConfig(cacheNames = "dept")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, Dept> implements DeptService {
@Override
public List<Dept> queryAll(DeptQueryCriteria criteria) {
return baseMapper.selectList(QueryHelpPlus.getPredicate(Dept.class, criteria));
}
/**
* 构建树形数据
*
* @param deptDtos 原始数据
* @return /
*/
@Override
public Object buildTree(List<DeptDto> deptDtos) {
Set<DeptDto> trees = new LinkedHashSet<>();
Set<DeptDto> depts = new LinkedHashSet<>();
List<String> deptNames = deptDtos.stream().map(DeptDto::getName).collect(Collectors.toList());
boolean isChild;
DeptQueryCriteria criteria = new DeptQueryCriteria();
List<Dept> deptList = this.queryAll(criteria);
for (DeptDto deptDto : deptDtos) {
isChild = false;
if ("0".equals(deptDto.getPid().toString())) {
trees.add(deptDto);
}
for (DeptDto it : deptDtos) {
if (it.getPid().equals(deptDto.getId())) {
isChild = true;
if (deptDto.getChildren() == null) {
deptDto.setChildren(new ArrayList<>());
}
deptDto.getChildren().add(it);
}
}
if (isChild) {
depts.add(deptDto);
for (Dept dept : deptList) {
if (dept.getId().equals(deptDto.getPid()) && !deptNames.contains(dept.getName())) {
depts.add(deptDto);
}
}
}
}
if (CollectionUtils.isEmpty(trees)) {
trees = depts;
}
Integer totalElements = deptDtos.size();
Map<String, Object> map = new HashMap<>(2);
map.put("totalElements", totalElements);
map.put("content", CollectionUtils.isEmpty(trees) ? deptDtos : trees);
return map;
}
//省略其他方法
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)