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

org.shoulder.web.template.crud.QueryController Maven / Gradle / Ivy

package org.shoulder.web.template.crud;

import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import jakarta.annotation.Nonnull;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Range;
import org.shoulder.core.dto.request.BasePageQuery;
import org.shoulder.core.dto.request.PageQuery;
import org.shoulder.core.dto.response.BaseResult;
import org.shoulder.core.dto.response.ListResult;
import org.shoulder.core.dto.response.PageResult;
import org.shoulder.core.model.Operable;
import org.shoulder.data.mybatis.template.entity.BaseEntity;
import org.shoulder.log.operation.annotation.OperationLog;
import org.shoulder.log.operation.annotation.OperationLogParam;
import org.shoulder.log.operation.context.OpLogContextHolder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 查询 API
 *
 * 暴露以下接口:
 * GET /{bizId}   根据 bizId 查询
 * POST /page     条件查询,分页
 * POST /listAll  条件查询,不分页
 *
 * @param            实体
 * @param                主键
 * @param  查询参数
 * @author lym
 */
@Validated
public interface QueryController<
        ENTITY extends BaseEntity,
        ID extends Serializable,
        PAGE_QUERY_PARAM extends Serializable,
        QueryResultDTO extends Serializable>
    extends BaseController {

    /**
     * 查询
     * service.getById —— mapper.selectById
     *
     * @param id 业务id
     * @return 查询结果
     */
    @Operation(summary = "单个查询", description = "单个查询")
    @GetMapping("/{id}")
    @OperationLog(operation = OperationLog.Operations.QUERY)
    default BaseResult queryByBizIdOrId(@OperationLogParam @PathVariable(name = "id") String id) {
        OpLogContextHolder.getLog().setObjectId(id);
        OpLogContextHolder.getLog().setObjectType(getEntityObjectType());
        ENTITY entity = extendsFromBizEntity() ? getService().getByBizId(id) :
            getService().getById(getConversionService().convert(id, getEntityIdType()));
        return BaseResult.success(convertEntityToQueryResult(entity));
    }

    /**
     * 分页查询
     * service.page —— mapper.selectPage
     *
     * @param pageQueryParam 分页参数
     * @return 分页数据
     */
    @Operation(summary = "分页查询")
    @PostMapping(value = "/page")
    @OperationLog(operation = OperationLog.Operations.QUERY)
    default BaseResult> page(
        @OperationLogParam @RequestBody @Valid @Nonnull PageQuery pageQueryParam) {
        // convert to BO
        BasePageQuery pageQuery = BasePageQuery.create(pageQueryParam, this::handleBeforeQueryAndConvertToEntity);
        OpLogContextHolder.getLog().setObjectType(getEntityObjectType());
        PageResult queryResult = getService().page(pageQuery);
        return BaseResult.success(queryResult.convertTo(this::convertEntityToQueryResult));
    }

    /**
     * 批量查询match入参的
     * service.list —— mapper.selectList
     *
     * @param example 批量查询条件
     * @return 查询结果
     */
    @Parameters({
        @Parameter(name = "example", description = "查询条件"),
    })
    @Operation(summary = "批量查询", description = "批量查询")
    @PostMapping("/listAll")
    @OperationLog(operation = OperationLog.Operations.QUERY)
    default BaseResult> listAll(@OperationLogParam @RequestBody ENTITY example,
                                                           @OperationLogParam @NotNull @RequestParam @Range(min = 1,
                                                               max = 1000) Integer limit) {
        if (Operable.class.isAssignableFrom(getEntityClass())) {
            if (example != null) {
                OpLogContextHolder.setOperableObject(example);
            }
            OpLogContextHolder.getLog().setObjectType(getEntityObjectType());
        }
        List entityList = getService().list(example, limit);
        List dtoList = getConversionService().convert((Collection) entityList, getQueryDtoClass());
        return BaseResult.success(dtoList);
    }

    /**
     * DTO 转 entity
     *
     * @param pageQueryParam dto
     * @return entity
     */
    default ENTITY handleBeforeQueryAndConvertToEntity(PAGE_QUERY_PARAM pageQueryParam) {
        return getConversionService().convert(pageQueryParam, getEntityClass());
    }

    default QueryResultDTO convertEntityToQueryResult(ENTITY entity) {
        return getConversionService().convert(entity, getQueryDtoClass());
    }

    @SuppressWarnings("unchecked")
    default Class getQueryDtoClass() {
        return (Class) GenericTypeUtils.resolveTypeArguments(this.getClass(), QueryController.class)[3];
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy