package com.zt.plat.module.qms.business.config.dal.mapper;

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.module.qms.business.config.controller.vo.MaterialAssayStandardMethodExtendRespVO;
import com.zt.plat.module.qms.business.config.controller.vo.MaterialAssayStandardMethodPageReqVO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigAssayMethodDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.MaterialAssayStandardDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.MaterialAssayStandardDetailDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.MaterialAssayStandardMethodDO;
import com.zt.plat.module.qms.enums.QmsCommonConstant;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

/**
 * 物料检测标准与方法 Mapper
 *
 * @author 后台管理
 */
@Mapper
public interface MaterialAssayStandardMethodMapper extends BaseMapperX<MaterialAssayStandardMethodDO> {

    default PageResult<MaterialAssayStandardMethodDO> selectPage(MaterialAssayStandardMethodPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MaterialAssayStandardMethodDO>()
                .eqIfPresent(MaterialAssayStandardMethodDO::getMaterialAssayStandardDetailId, reqVO.getMaterialAssayStandardDetailId())
                .eqIfPresent(MaterialAssayStandardMethodDO::getConfigAssayMethodId, reqVO.getConfigAssayMethodId())
                .eqIfPresent(MaterialAssayStandardMethodDO::getAssayDepartmentId, reqVO.getAssayDepartmentId())
                .likeIfPresent(MaterialAssayStandardMethodDO::getAssayDepartmentName, reqVO.getAssayDepartmentName())
                .eqIfPresent(MaterialAssayStandardMethodDO::getIsDualCup, reqVO.getIsDualCup())
                .eqIfPresent(MaterialAssayStandardMethodDO::getIsDefault, reqVO.getIsDefault())
                .eqIfPresent(MaterialAssayStandardMethodDO::getIsRecheckDefault, reqVO.getIsRecheckDefault())
                .eqIfPresent(MaterialAssayStandardMethodDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .betweenIfPresent(MaterialAssayStandardMethodDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(MaterialAssayStandardMethodDO::getRemark, reqVO.getRemark())
                .orderByDesc(MaterialAssayStandardMethodDO::getId));
    }
    
    default List<MaterialAssayStandardMethodDO> selectByMaterialAssayStandardDetailIds(List<Long> materialAssayStandardDetailIdList) {
    	return selectList(new LambdaQueryWrapperX<MaterialAssayStandardMethodDO>()
    			.in(MaterialAssayStandardMethodDO::getMaterialAssayStandardDetailId, materialAssayStandardDetailIdList));
    }
    
    /**
     * 根据样品大类id和检测项目id获取对应的默认检测方法
     * @param baseSampleId 样品大类id
     * @param dictionaryProjectId 检测项目id
     * @return
     */
    default MaterialAssayStandardMethodDO selectByBaseSampleIdAndDictionaryProjectId(Long baseSampleId, Long dictionaryProjectId) {
    	return selectJoinOne(MaterialAssayStandardMethodDO.class, new MPJLambdaWrapperX<MaterialAssayStandardMethodDO>()
    			.leftJoin(MaterialAssayStandardDetailDO.class, MaterialAssayStandardDetailDO::getId, MaterialAssayStandardMethodDO::getMaterialAssayStandardDetailId)
    			.leftJoin(MaterialAssayStandardDO.class, MaterialAssayStandardDO::getId, MaterialAssayStandardDetailDO::getMaterialAssayStandardId)
    			.eq(MaterialAssayStandardDO::getBaseSampleId, baseSampleId)
    			.eq(MaterialAssayStandardDetailDO::getDictionaryProjectId, dictionaryProjectId)
    			.eq(MaterialAssayStandardMethodDO::getIsDefault, QmsCommonConstant.YES));
    }

	default List<MaterialAssayStandardMethodExtendRespVO> selectByBaseSampleIdAndDictionaryProjectIdsAndAssayDepartmentId(Long baseSampleId, List<Long> dictionaryProjectIdList, Long assayDepartmentId) {
		return selectJoinList(MaterialAssayStandardMethodExtendRespVO.class, new MPJLambdaWrapperX<MaterialAssayStandardMethodDO>()
				.leftJoin(MaterialAssayStandardDetailDO.class, MaterialAssayStandardDetailDO::getId, MaterialAssayStandardMethodDO::getMaterialAssayStandardDetailId)
    			.leftJoin(MaterialAssayStandardDO.class, MaterialAssayStandardDO::getId, MaterialAssayStandardDetailDO::getMaterialAssayStandardId)
    			.leftJoin(ConfigAssayMethodDO.class, ConfigAssayMethodDO::getId, MaterialAssayStandardMethodDO::getConfigAssayMethodId)
    			.selectAll(MaterialAssayStandardMethodDO.class)
    			.selectAs(MaterialAssayStandardDetailDO::getDictionaryProjectId, MaterialAssayStandardMethodExtendRespVO::getDictionaryProjectId)
    			.selectAs(ConfigAssayMethodDO::getName, MaterialAssayStandardMethodExtendRespVO::getConfigAssayMethodName)
    			.selectAs(ConfigAssayMethodDO::getMethodNameCategory, MaterialAssayStandardMethodExtendRespVO::getConfigAssayMethodNameAndCategory)
    			.eq(MaterialAssayStandardDO::getBaseSampleId, baseSampleId)
    			.in(MaterialAssayStandardDetailDO::getDictionaryProjectId, dictionaryProjectIdList)
    			.eq(ConfigAssayMethodDO::getAssayDepartmentId, assayDepartmentId));
	}


}