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

import java.util.*;

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.module.qms.business.bus.controller.vo.*;
import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayParameterDataPageReqVO;
import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayParameterDataReqVO;
import com.zt.plat.module.qms.business.bus.controller.vo.BusinessAssayProjectAndParameterRespVO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayParameterDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayProjectDataDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigAssayMethodProjectDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigAssayMethodProjectParameterDO;
import com.zt.plat.module.qms.business.dic.dal.dataobject.DictionaryProjectDO;
import com.zt.plat.module.qms.common.dic.dal.dataobject.DictionaryBusinessDO;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;

/**
 * 检测参数数据业务 Mapper
 *
 * @author 后台管理
 */
@Mapper
public interface BusinessAssayParameterDataMapper extends BaseMapperX<BusinessAssayParameterDataDO> {

	default List<BusinessAssayProjectAndParameterRespVO> selectProjectAndParameterBy(BusinessAssayParameterDataReqVO reqVO) {
		return selectJoinList(BusinessAssayProjectAndParameterRespVO.class, new MPJLambdaWrapperX<BusinessAssayParameterDataDO>()
				.leftJoin(ConfigAssayMethodProjectParameterDO.class, ConfigAssayMethodProjectParameterDO::getId, BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId)
				.leftJoin(DictionaryBusinessDO.class, DictionaryBusinessDO::getId, ConfigAssayMethodProjectParameterDO::getDictionaryBusinessId)
				.selectAs(BusinessAssayParameterDataDO::getId, BusinessAssayProjectAndParameterRespVO::getId)
				.selectAs(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, BusinessAssayProjectAndParameterRespVO::getBizId)
				.selectAs(BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId, BusinessAssayProjectAndParameterRespVO::getDicId)
				.selectAs(ConfigAssayMethodProjectParameterDO::getKey, BusinessAssayProjectAndParameterRespVO::getDicKey)
				.selectAs(ConfigAssayMethodProjectParameterDO::getParameterName, BusinessAssayProjectAndParameterRespVO::getName)
				.selectAs(ConfigAssayMethodProjectParameterDO::getParameterName, BusinessAssayProjectAndParameterRespVO::getShowName)
				.selectAs(ConfigAssayMethodProjectParameterDO::getFillingWay, BusinessAssayProjectAndParameterRespVO::getFillingWay)
				.selectAs(BusinessAssayParameterDataDO::getDataType, BusinessAssayProjectAndParameterRespVO::getDataType)
				.selectAs(BusinessAssayParameterDataDO::getDecimalPosition, BusinessAssayProjectAndParameterRespVO::getDecimalPosition)
				.selectAs(BusinessAssayParameterDataDO::getDecimalPosition, BusinessAssayProjectAndParameterRespVO::getEffectiveDigit)//参数有效数字位与小数位相同
				.selectAs(BusinessAssayParameterDataDO::getValue, BusinessAssayProjectAndParameterRespVO::getValue)
				.selectAs(BusinessAssayParameterDataDO::getSymbol, BusinessAssayProjectAndParameterRespVO::getSymbol)
				.selectAs(ConfigAssayMethodProjectParameterDO::getUnit, BusinessAssayProjectAndParameterRespVO::getUnit)
				.selectAs(ConfigAssayMethodProjectParameterDO::getIsNull, BusinessAssayProjectAndParameterRespVO::getIsNull)
				.selectAs(ConfigAssayMethodProjectParameterDO::getFormula, BusinessAssayProjectAndParameterRespVO::getFormula)
				.selectAs(ConfigAssayMethodProjectParameterDO::getNo, BusinessAssayProjectAndParameterRespVO::getParamNo)
				.selectAs("'parameter'", BusinessAssayProjectAndParameterRespVO::getType)
				.selectAs(ConfigAssayMethodProjectParameterDO::getDictionaryBusinessId, BusinessAssayProjectAndParameterRespVO::getGroupDictionaryBusinessId)
				.selectAs(ConfigAssayMethodProjectParameterDO::getDictionaryBusinessKey, BusinessAssayProjectAndParameterRespVO::getGroupDictionaryBusinessKey)
				.selectAs(DictionaryBusinessDO::getName, BusinessAssayProjectAndParameterRespVO::getGroupDictionaryBusinessName)
                .eqIfPresent(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, reqVO.getBusinessAssayProjectDataId())
                .inIfPresent(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, reqVO.getBusinessAssayProjectDataIdList())
                .eqIfPresent(BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId, reqVO.getConfigAssayMethodProjectParameterId())
                .eqIfPresent(BusinessAssayParameterDataDO::getDictionaryParameterId, reqVO.getDictionaryParameterId())
                .eqIfPresent(BusinessAssayParameterDataDO::getValue, reqVO.getValue())
                .eqIfPresent(BusinessAssayParameterDataDO::getDataType, reqVO.getDataType())
                .eqIfPresent(BusinessAssayParameterDataDO::getDecimalPosition, reqVO.getDecimalPosition())
                .eqIfPresent(BusinessAssayParameterDataDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .betweenIfPresent(BusinessAssayParameterDataDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(BusinessAssayParameterDataDO::getUpdateCount, reqVO.getUpdateCount())
                .eqIfPresent(BusinessAssayParameterDataDO::getRemark, reqVO.getRemark())
                .orderByAsc(ConfigAssayMethodProjectParameterDO::getSortNo));
	}
	
    default PageResult<BusinessAssayParameterDataDO> selectPage(BusinessAssayParameterDataPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<BusinessAssayParameterDataDO>()
                .eqIfPresent(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, reqVO.getBusinessAssayProjectDataId())
                .eqIfPresent(BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId, reqVO.getConfigAssayMethodProjectParameterId())
                .eqIfPresent(BusinessAssayParameterDataDO::getDictionaryParameterId, reqVO.getDictionaryParameterId())
                .eqIfPresent(BusinessAssayParameterDataDO::getValue, reqVO.getValue())
                .eqIfPresent(BusinessAssayParameterDataDO::getDataType, reqVO.getDataType())
                .eqIfPresent(BusinessAssayParameterDataDO::getDecimalPosition, reqVO.getDecimalPosition())
                .eqIfPresent(BusinessAssayParameterDataDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .betweenIfPresent(BusinessAssayParameterDataDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(BusinessAssayParameterDataDO::getUpdateCount, reqVO.getUpdateCount())
                .eqIfPresent(BusinessAssayParameterDataDO::getRemark, reqVO.getRemark())
                .orderByDesc(BusinessAssayParameterDataDO::getId));
    }
    
    default List<BusinessAssayParameterDataDO> selectByBusinessAssayProjectDataId(Long businessAssayProjectDataId) {
    	return selectList(new LambdaQueryWrapperX<BusinessAssayParameterDataDO>()
    			.eq(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, businessAssayProjectDataId));
    }
    
    default List<BusinessAssayParameterDataDO> selectByBusinessAssayProjectDataIds(List<Long> businessAssayProjectDataIds) {
    	return selectList(new LambdaQueryWrapperX<BusinessAssayParameterDataDO>()
    			.in(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, businessAssayProjectDataIds));
    }
    
    default List<BusinessAssayParameterDataExtendRespVO> selectExtendByBusinessAssayProjectDataIds(List<Long> businessAssayProjectDataIds) {
    	return selectJoinList(BusinessAssayParameterDataExtendRespVO.class, new MPJLambdaWrapperX<BusinessAssayParameterDataDO>()
    			.leftJoin(ConfigAssayMethodProjectParameterDO.class, ConfigAssayMethodProjectParameterDO::getId, BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId)
    			.selectAll(BusinessAssayParameterDataDO.class)
    			.selectAs(ConfigAssayMethodProjectParameterDO::getParameterName, BusinessAssayParameterDataExtendRespVO::getParameterName)
    			.selectAs(ConfigAssayMethodProjectParameterDO::getKey, BusinessAssayParameterDataExtendRespVO::getParameterKey)
    			.in(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, businessAssayProjectDataIds));
    }
    
    default BusinessAssayParameterDataDO selectByBusinessAssayTaskDataIdAndProjectSimpleNameAndParameterKey(Long businessAssayTaskDataId, String projectSimpleName, String parameterKey) {
    	return selectJoinOne(BusinessAssayParameterDataDO.class, new MPJLambdaWrapperX<BusinessAssayParameterDataDO>()
    			.leftJoin(ConfigAssayMethodProjectParameterDO.class, ConfigAssayMethodProjectParameterDO::getId, BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId)
    			.leftJoin(BusinessAssayProjectDataDO.class, BusinessAssayProjectDataDO::getId, BusinessAssayParameterDataDO::getBusinessAssayProjectDataId)
    			.leftJoin(ConfigAssayMethodProjectDO.class, ConfigAssayMethodProjectDO::getId, BusinessAssayProjectDataDO::getConfigAssayMethodProjectId)
    			.leftJoin(DictionaryProjectDO.class, DictionaryProjectDO::getId, BusinessAssayProjectDataDO::getDictionaryProjectId)
    			.eq(BusinessAssayProjectDataDO::getBusinessAssayTaskDataId, businessAssayTaskDataId)
    			.eq(DictionaryProjectDO::getSimpleName, projectSimpleName)
    			.eq(ConfigAssayMethodProjectParameterDO::getKey, parameterKey));
    }
    
    default BusinessAssayParameterDataDO selectByBusinessAssayProjectDataIdAndProjectSimpleNameAndParameterKey(Long businessAssayProjectDataId, String projectSimpleName, String parameterKey) {
    	return selectJoinOne(BusinessAssayParameterDataDO.class, new MPJLambdaWrapperX<BusinessAssayParameterDataDO>()
    			.leftJoin(ConfigAssayMethodProjectParameterDO.class, ConfigAssayMethodProjectParameterDO::getId, BusinessAssayParameterDataDO::getConfigAssayMethodProjectParameterId)
    			.leftJoin(BusinessAssayProjectDataDO.class, BusinessAssayProjectDataDO::getId, BusinessAssayParameterDataDO::getBusinessAssayProjectDataId)
    			.leftJoin(ConfigAssayMethodProjectDO.class, ConfigAssayMethodProjectDO::getId, BusinessAssayProjectDataDO::getConfigAssayMethodProjectId)
    			.leftJoin(DictionaryProjectDO.class, DictionaryProjectDO::getId, BusinessAssayProjectDataDO::getDictionaryProjectId)
    			.eq(BusinessAssayParameterDataDO::getBusinessAssayProjectDataId, businessAssayProjectDataId)
    			.eq(DictionaryProjectDO::getSimpleName, projectSimpleName)
    			.eq(ConfigAssayMethodProjectParameterDO::getKey, parameterKey));
    }

}