package com.zt.plat.module.qms.resource.material.dal.mapper;

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseRecordPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseRecordRespVO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialInfomationDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialProductDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialUseRecordDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 使用记录 Mapper
 *
 * @author 后台管理
 */
@Mapper
public interface MaterialUseRecordMapper extends BaseMapperX<MaterialUseRecordDO> {

    default PageResult<MaterialUseRecordDO> selectPage(MaterialUseRecordPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MaterialUseRecordDO>()
                .eqIfPresent(MaterialUseRecordDO::getInfomationId, reqVO.getInfomationId())
                .eqIfPresent(MaterialUseRecordDO::getHazardousMakeFlag, reqVO.getHazardousMakeFlag())
                .eqIfPresent(MaterialUseRecordDO::getOperationQuantity, reqVO.getOperationQuantity())
                .eqIfPresent(MaterialUseRecordDO::getBeforeQuantity, reqVO.getBeforeQuantity())
                .eqIfPresent(MaterialUseRecordDO::getAfterQuantity, reqVO.getAfterQuantity())
                .betweenIfPresent(MaterialUseRecordDO::getUseDate, reqVO.getUseDate())
                .eqIfPresent(MaterialUseRecordDO::getUserId, reqVO.getUserId())
                .likeIfPresent(MaterialUseRecordDO::getUserName, reqVO.getUserName())
                .eqIfPresent(MaterialUseRecordDO::getReason, reqVO.getReason())
                .eqIfPresent(MaterialUseRecordDO::getSupervisorId, reqVO.getSupervisorId())
                .likeIfPresent(MaterialUseRecordDO::getSupervisorName, reqVO.getSupervisorName())
                .eqIfPresent(MaterialUseRecordDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .eqIfPresent(MaterialUseRecordDO::getRemark, reqVO.getRemark())
                .betweenIfPresent(MaterialUseRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MaterialUseRecordDO::getId));
    }

    default PageResult<MaterialUseRecordRespVO> selectPageWithInf(MaterialUseRecordPageReqVO reqVO) {
        MPJLambdaWrapperX<MaterialUseRecordDO> wrapperX = new MPJLambdaWrapperX<MaterialUseRecordDO>()
                .selectAll(MaterialUseRecordDO.class)
                .selectAs(MaterialInfomationDO::getCode, MaterialUseRecordRespVO::getInfomationCode)
                .selectAs(MaterialProductDO::getName, MaterialUseRecordRespVO::getInfomationName)
                .selectAs(MaterialProductDO::getModelNo, MaterialUseRecordRespVO::getModelNo)
                .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseRecordDO::getInfomationId)
                .innerJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId)
                .eqIfPresent(MaterialProductDO::getId, reqVO.getProductId())
                .eqIfPresent(MaterialUseRecordDO::getReviewStatus, reqVO.getReviewStatus())
                .eqIfPresent(MaterialUseRecordDO::getInfomationId, reqVO.getInfomationId())
                .eqIfPresent(MaterialUseRecordDO::getHazardousMakeFlag, reqVO.getHazardousMakeFlag())
                .betweenIfPresent(MaterialUseRecordDO::getUseDate, reqVO.getUseDate())
                .likeIfPresent(MaterialUseRecordDO::getUserName, reqVO.getUserName())
                .likeIfPresent(MaterialUseRecordDO::getReason, reqVO.getReason())
                .eqIfPresent(MaterialUseRecordDO::getSupervisorId, reqVO.getSupervisorId())
                .likeIfPresent(MaterialUseRecordDO::getSupervisorName, reqVO.getSupervisorName())
                .eqIfPresent(MaterialUseRecordDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .likeIfPresent(MaterialUseRecordDO::getRemark, reqVO.getRemark())
                .betweenIfPresent(MaterialUseRecordDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MaterialInfomationDO::getId);
        return selectJoinPage(reqVO, MaterialUseRecordRespVO.class, wrapperX);
    }

    default List<MaterialUseRecordRespVO> selectListWithInf(List<Long> ids) {
        MPJLambdaWrapperX<MaterialUseRecordDO> wrapperX = new MPJLambdaWrapperX<MaterialUseRecordDO>()
                .selectAll(MaterialUseRecordDO.class)
                .selectAs(MaterialInfomationDO::getCode, MaterialUseRecordRespVO::getInfomationCode)
                .selectAs(MaterialProductDO::getName, MaterialUseRecordRespVO::getInfomationName)
                .selectAs(MaterialProductDO::getSpecification, MaterialUseRecordRespVO::getSpecification)
                .selectAs(MaterialProductDO::getModelNo, MaterialUseRecordRespVO::getModelNo)
                .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseRecordDO::getInfomationId)
                .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId)
                .in(MaterialUseRecordDO::getId, ids);
        return selectJoinList(MaterialUseRecordRespVO.class, wrapperX);
    }
}