package cn.iocoder.yudao.module.system.dal.mysql.biz;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedPlanRecordPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedPlanRecordEffectiveQueryReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.BedPlanRecordDO;
import org.apache.ibatis.annotations.Mapper;

/**
 * 床位计划记录 Mapper
 */
@Mapper
public interface BedPlanRecordMapper extends BaseMapperX<BedPlanRecordDO> {

    default PageResult<BedPlanRecordDO> selectPage(BedPlanRecordPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<BedPlanRecordDO>()
                .eqIfPresent(BedPlanRecordDO::getBuildId, reqVO.getBuildId())
                .eqIfPresent(BedPlanRecordDO::getFloorId, reqVO.getFloorId())
                .eqIfPresent(BedPlanRecordDO::getBeginYearMonth, reqVO.getBeginYearMonth())
                .eqIfPresent(BedPlanRecordDO::getEndYearMonth, reqVO.getEndYearMonth())
                .eqIfPresent(BedPlanRecordDO::getPlanSeq, reqVO.getPlanSeq())
                .eqIfPresent(BedPlanRecordDO::getBedCount, reqVO.getBedCount())
                .inIfPresent(BedPlanRecordDO::getTenantId, reqVO.getTenantIds())
                .betweenIfPresent(BedPlanRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(BedPlanRecordDO::getId));
    }

    /**
     * 统计同楼栋楼层在生效期内是否存在交叉记录
     */
    default Long selectOverlapCount(Long buildId, Long floorId, String beginYearMonth, String endYearMonth, Long tenantId) {
        return selectCount(new LambdaQueryWrapperX<BedPlanRecordDO>()
                .eq(BedPlanRecordDO::getBuildId, buildId)
                .eq(BedPlanRecordDO::getFloorId, floorId)
                .eqIfPresent(BedPlanRecordDO::getTenantId, tenantId)
                // 生效期交叉：已有记录的开始<=新结束 且 已有记录的结束>=新开始
                .le(BedPlanRecordDO::getBeginYearMonth, endYearMonth)
                .ge(BedPlanRecordDO::getEndYearMonth, beginYearMonth));
    }

    /**
     * 查询生效期内的记录
     */
    default java.util.List<BedPlanRecordDO> selectEffectiveList(BedPlanRecordEffectiveQueryReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<BedPlanRecordDO>()
                .inIfPresent(BedPlanRecordDO::getTenantId, reqVO.getTenantIds())
                .leIfPresent(BedPlanRecordDO::getBeginYearMonth, reqVO.getEndYearMonth())
                .geIfPresent(BedPlanRecordDO::getEndYearMonth, reqVO.getBeginYearMonth())
                .orderByAsc(BedPlanRecordDO::getBuildId)
                .orderByAsc(BedPlanRecordDO::getFloorId)
                .orderByAsc(BedPlanRecordDO::getPlanSeq));
    }
}


