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

/**
 * @Author: jinyd
 * @CreateTime: 2024/8/19  11:34
 * @Description:
 * @Version: 4.0
 */

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.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.api.bpm.vo.*;
import cn.iocoder.yudao.module.system.api.bpm.vo.BedChangeRecordRespVO;
import cn.iocoder.yudao.module.system.api.bpm.vo.PriceChangeRecordRespVO;
import cn.iocoder.yudao.module.system.api.order.VO.BedNurseChangeOriginVO;
import cn.iocoder.yudao.module.system.api.order.VO.ExpenseItemWithOriginAmountVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyChangeRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.ElderlyInfoDO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.ExpenseItemDO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 变更记录 Mapper
 *
 * @author 系统管理员
 */
@Mapper
public interface ElderlyChangeRecordMapper extends BaseMapperX<ElderlyChangeRecordDO> {

    List<ElderlyChangeRecordDO> selectLastNurseRecordByElderIds(@Param("elderIds") List<Long> elderIds,
                                                                @Param("tenantId") Long tenantId,
                                                                @Param("monthEnd") LocalDate monthEnd);

    List<ElderlyChangeRecordDO> selectLastBedRecordByElderIds(@Param("elderIds") List<Long> elderIds,
                                                             @Param("tenantId") Long tenantId,
                                                             @Param("monthEnd") LocalDate monthEnd);

    default PageResult<ElderlyChangeRecordDO> selectPage(BedChangeRecordPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ElderlyChangeRecordDO>()
                .eqIfPresent(ElderlyChangeRecordDO::getElderlyId, reqVO.getElderlyId())
                .eqIfPresent(ElderlyChangeRecordDO::getOriginalId, reqVO.getOriginalBedId())
                .likeIfPresent(ElderlyChangeRecordDO::getOriginalName, reqVO.getOriginalBedName())
                .betweenIfPresent(ElderlyChangeRecordDO::getChangeDate, reqVO.getChangeDate())
                .eqIfPresent(ElderlyChangeRecordDO::getExpectId, reqVO.getBedId())
                .likeIfPresent(ElderlyChangeRecordDO::getExpectName, reqVO.getBedName())
                .eqIfPresent(ElderlyChangeRecordDO::getAmount, reqVO.getAmount())
                .eqIfPresent(ElderlyChangeRecordDO::getIsDiscount, reqVO.getIsDiscount())
                .eqIfPresent(ElderlyChangeRecordDO::getIsPrivateRoom, reqVO.getIsPrivateRoom())
                .eqIfPresent(ElderlyChangeRecordDO::getChangeFiles, reqVO.getBedFiles())
                .eqIfPresent(ElderlyChangeRecordDO::getReason, reqVO.getReason())
                .orderByDesc(ElderlyChangeRecordDO::getId));
    }

    List<BedChangeRecordRespVO> selectBedListPage(Page<BedChangeRecordRespVO> page,
                                               @Param("pageVO") BedChangeRecordPageReqApiVO pageReqVO);

    cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeRecordRespVO getBedDetail(@Param("id") Long id, @Param("currentFlag") Integer currentFlag);
    cn.iocoder.yudao.module.system.controller.admin.biz.vo.BedChangeRecordRespVO createBedChangeGetDetail(@Param("id") Long id, @Param("currentFlag") Integer currentFlag);

    List<BedChangeElderlyRespVO> selectElderlyPage(Page<ElderlyInfoDO> page,
                                                   @Param("pageVO") ElderlyInfoPageReqVO pageVO);

    List<BedChangeElderlyRespVO> selectElderlyById(Page<ElderlyInfoDO> page,
                                                  @Param("pageVO") ElderlyInfoPageReqVO pageVO,
                                                  @Param("elderId") Long elderId);

    List<NurseChangeRecordRespVO> selectNurseListPage(Page<NurseChangeRecordRespVO> page,
                                                      @Param("pageVO") ChangeRecordPageReqApiVO pageReqVO);

    List<CateringChangeRecordRespVO> selectCateringListPage(Page<CateringChangeRecordRespVO> page,
                                                      @Param("pageVO") ChangeRecordPageReqApiVO pageReqVO);

    List<PriceChangeRecordRespVO> selectPriceListPage(Page<PriceChangeRecordRespVO> page,
                                                      @Param("pageVO") ChangeRecordPageReqApiVO pageReqVO);

    List<TransferChangeRecordRespVO> selectTransferListPage(Page<TransferChangeRecordRespVO> page,
                                                            @Param("pageVO") ChangeRecordPageReqApiVO pageReqVO);

    List<NurseChangeyEvaluationRespVO> getEvaluationByElderId(Long elderId);

    NurseChangeDetailRespVO getNurseDetail(Long id);
    NurseChangeDetailRespVO createNurseChangeGetDetail(Long id);

    CateringChangeDetailRespVO getCateringDetail(Long id);
    CateringChangeDetailRespVO createCateringChangeGetDetail(Long id);

    TransferChangeDetailRespVO selectDetail(Long id);

    List<BedChangeElderlyRespVO> selectTransferElderlyPage(Page<ElderlyInfoDO> page, @Param("pageVO") ElderlyInfoPageReqVO pageVO);

    ElderlyChangeRecordDO selectLastRecordByElderId(@Param("elderlyId") Long elderlyId, @Param("bpmType") Integer bpmType,
                                                    @Param("changeType") Integer changeType, @Param("changeDate")LocalDate changeDate,
                                                    @Param("id")Long id);

    Integer checkBpmBusinessFormById(Long id);

    @TenantIgnore
    BedNurseChangeOriginVO getBedNurseChangeOriginById(@Param("expenseItemId")Long expenseItemId,
                                                        @Param("begin")String begin,
                                                        @Param("end")String end);
}
