All Downloads are FREE. Search and download functionalities are using the official Maven repository.

app.myoss.cloud.mybatis.repository.service.impl.RetrieveIncludeLogicDeleteCrudServiceImpl Maven / Gradle / Ivy

/*
 * Copyright 2018-2018 https://github.com/myoss
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package app.myoss.cloud.mybatis.repository.service.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.ibatis.mapping.SqlCommandType;

import app.myoss.cloud.core.lang.dto.Order;
import app.myoss.cloud.core.lang.dto.Page;
import app.myoss.cloud.core.lang.dto.Result;
import app.myoss.cloud.core.lang.dto.Sort;
import app.myoss.cloud.mybatis.mapper.template.CrudMapper;
import app.myoss.cloud.mybatis.repository.service.RetrieveIncludeLogicDeleteService;
import app.myoss.cloud.mybatis.table.annotation.Column;
import lombok.extern.slf4j.Slf4j;

/**
 * 实现数据库表增、删、改、查常用操作的基类,查询支持不过滤掉已经被标记为逻辑删除({@link Column#logicDelete})的数据
 *
 * @param  "实体类"的 Mapper Interface 接口
 * @param  实体类
 * @author Jerry.Chen
 * @since 2018年6月11日 下午11:21:32
 */
@Slf4j
public class RetrieveIncludeLogicDeleteCrudServiceImpl, T> extends BaseCrudServiceImpl
        implements RetrieveIncludeLogicDeleteService {
    /**
     * 标记不过滤掉已经被标记为逻辑删除({@link Column#logicDelete})的数据
     */
    public static final String MARK_IS_INCLUDE_LOGIC_DELETE = "isIncludeLogicDelete";

    /**
     * 为 {@code extraCondition} 添加 {@link #MARK_IS_INCLUDE_LOGIC_DELETE} 为
     * {@code true} 的记录,标记查询不需要滤掉已经被标记为逻辑删除({@link Column#logicDelete})的数据
     *
     * @param extraCondition 扩展查询条件,需要自定义
     * @return 如果入参 {@code extraCondition} 为 {@code null},则创建一个新的对象;否则返回
     *         {@code extraCondition} 入参
     */
    protected Map markQueryIsIncludeLogicDelete(Map extraCondition) {
        if (extraCondition == null) {
            extraCondition = new HashMap<>(1);
        }
        extraCondition.put(MARK_IS_INCLUDE_LOGIC_DELETE, true);
        return extraCondition;
    }

    /**
     * 检查查询条件是否需要过滤已经被标记为逻辑删除({@link Column#logicDelete})的数据
     *
     * @param extraCondition 扩展查询条件,需要自定义
     * @return true: 不需要滤掉; false: 需要滤掉
     */
    protected boolean checkQueryIsIncludeLogicDelete(Map extraCondition) {
        if (extraCondition == null) {
            return false;
        }
        return BooleanUtils.toBoolean((Boolean) extraCondition.get(MARK_IS_INCLUDE_LOGIC_DELETE));
    }

    @Override
    public Result findByPrimaryKeyIncludeLogicDelete(Serializable id) {
        Result result = new Result<>();
        if (checkPrimaryKeyIsNull(SqlCommandType.SELECT, result, id)) {
            T entity = crudMapper.selectByPrimaryKeyIncludeLogicDelete(id);
            result.setValue(entity);
        }
        return result;
    }

    @Override
    public Result findByPrimaryKeyIncludeLogicDelete(T condition) {
        Result result = new Result<>();
        if (checkPrimaryKeyIsNull(SqlCommandType.SELECT, result, condition)) {
            T entity = crudMapper.selectWithPrimaryKeyIncludeLogicDelete(condition);
            result.setValue(entity);
        }
        return result;
    }

    @Override
    public Result findOneIncludeLogicDelete(T condition) {
        Result result = new Result<>();
        if (checkCommonQueryConditionIsAllNull(SqlCommandType.SELECT, result, condition,
                markQueryIsIncludeLogicDelete(null))) {
            T one = crudMapper.selectOneIncludeLogicDelete(condition);
            result.setValue(one);
        }
        return result;
    }

    @Override
    public Result> findListIncludeLogicDelete(T condition) {
        Result> result = new Result<>();
        if (checkCommonQueryConditionIsAllNull(SqlCommandType.SELECT, result, condition,
                markQueryIsIncludeLogicDelete(null))) {
            List list = crudMapper.selectListIncludeLogicDelete(condition);
            result.setValue(list);
        }
        return result;
    }

    @Override
    public Result> findListWithSortIncludeLogicDelete(Page condition) {
        Result> result = new Result<>();
        T param = condition.getParam();
        Map extraInfo = condition.getExtraInfo();
        if (checkCommonQueryConditionIsAllNull(SqlCommandType.SELECT, result, param,
                markQueryIsIncludeLogicDelete(extraInfo))) {
            Sort sort = condition.getSort();
            List orders = convertToOrders(sort);
            List list = crudMapper.selectListWithSortIncludeLogicDelete2(param, extraInfo, orders);
            result.setValue(list);
        }
        return result;
    }

    @Override
    public Result findCountIncludeLogicDelete(T condition) {
        Result result = new Result<>();
        if (checkCommonQueryConditionIsAllNull(SqlCommandType.SELECT, result, condition,
                markQueryIsIncludeLogicDelete(null))) {
            int count = crudMapper.selectCountIncludeLogicDelete(condition);
            result.setValue(count);
        }
        return result;
    }

    @Override
    public Result findCountIncludeLogicDelete(T condition, Map extraCondition) {
        Result result = new Result<>();
        if (checkCommonQueryConditionIsAllNull(SqlCommandType.SELECT, result, condition,
                markQueryIsIncludeLogicDelete(extraCondition))) {
            int count = crudMapper.selectCountIncludeLogicDelete2(condition, extraCondition);
            result.setValue(count);
        }
        return result;
    }

    @Override
    public Page findPageIncludeLogicDelete(Page condition) {
        Page result = new Page<>();
        condition.setExtraInfo(markQueryIsIncludeLogicDelete(condition.getExtraInfo()));
        if (!checkPageConditionIsAllNull(condition, result)) {
            return result;
        }

        int pageSize = condition.getPageSize();
        int pageNum = condition.getPageNum();
        int dbPageNum = Math.max(0, pageNum - 1);
        int pageStart = dbPageNum * pageSize;
        T param = condition.getParam();
        Sort sort = condition.getSort();
        List orders = convertToOrders(sort);
        Map extraInfo = condition.getExtraInfo();
        List details = crudMapper.selectPageIncludeLogicDelete2(param, extraInfo, pageStart, pageSize, orders);
        int totalCount = crudMapper.selectCountIncludeLogicDelete2(param, extraInfo);
        // 设置额外字段
        addPageExtraInfo(condition, result);

        result.setValue(details).setTotalCount(totalCount).setPageNum(dbPageNum + 1).setPageSize(pageSize);
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy