package com.zt.plat.module.qms.business.bus.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.module.qms.business.bus.controller.vo.*;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDetailDO;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 检测任务分配明细 Mapper
 *
 * @author 后台管理
 */
@Mapper
public interface BusinessAssayTaskDetailMapper extends BaseMapperX<BusinessAssayTaskDetailDO> {

    default PageResult<BusinessAssayTaskDetailExtendRespVO> selectPage(BusinessAssayTaskDetailPageReqVO reqVO) {
        return selectJoinPage(reqVO, BusinessAssayTaskDetailExtendRespVO.class, new MPJLambdaWrapperX<BusinessAssayTaskDetailDO>()
        		.leftJoin(BusinessAssayTaskDataDO.class, BusinessAssayTaskDataDO::getId, BusinessAssayTaskDetailDO::getBusinessAssayTaskDataId)
        		.selectAll(BusinessAssayTaskDetailDO.class)
        		.selectAs(BusinessAssayTaskDetailDO::getSampleCode, BusinessAssayTaskDetailExtendRespVO::getSampleAssayCode)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessBaseSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessBaseSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessSubParentSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessSubParentSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessSubSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessSubSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getConfigAssayMethodId, BusinessAssayTaskDetailExtendRespVO::getConfigAssayMethodId)
        		.selectAs(BusinessAssayTaskDataDO::getTaskType, BusinessAssayTaskDetailExtendRespVO::getTaskType)
        		.selectAs(BusinessAssayTaskDataDO::getAssayType, BusinessAssayTaskDetailExtendRespVO::getAssayType)
        		.selectAs(BusinessAssayTaskDataDO::getAssayProject, BusinessAssayTaskDetailExtendRespVO::getAssayProject)
        		.selectAs(BusinessAssayTaskDataDO::getAssayOperator, BusinessAssayTaskDetailExtendRespVO::getAssayOperator)
        		.selectAs(BusinessAssayTaskDataDO::getAssayDepartmentId, BusinessAssayTaskDetailExtendRespVO::getAssayDepartmentId)
        		.selectAs(BusinessAssayTaskDataDO::getAssayDepartmentName, BusinessAssayTaskDetailExtendRespVO::getAssayDepartmentName)
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskDataId, reqVO.getBusinessAssayTaskDataId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskId, reqVO.getBusinessAssayTaskId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSampleId, reqVO.getSampleId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getTaskNo, reqVO.getTaskNo())
                .likeIfPresent(BusinessAssayTaskDetailDO::getSampleName, reqVO.getSampleName())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSampleCode, reqVO.getSampleCode())
                .eqIfPresent(BusinessAssayTaskDetailDO::getCupNumber, reqVO.getCupNumber())
                .eqIfPresent(BusinessAssayTaskDetailDO::getDataSourceType, reqVO.getDataSourceType())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSortNo, reqVO.getSortNo())
                .eqIfPresent(BusinessAssayTaskDetailDO::getRollbackStatus, reqVO.getRollbackStatus())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .betweenIfPresent(BusinessAssayTaskDetailDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(BusinessAssayTaskDetailDO::getRemark, reqVO.getRemark())
                .orderByAsc("NVL(REGEXP_SUBSTR(SMP_CD, '^(.*-)'), SMP_CD)")
                .orderByAsc("CASE WHEN INSTR(SMP_CD, '-') = 0 THEN 0 WHEN REGEXP_LIKE(REGEXP_SUBSTR(SMP_CD, '[^-]+$'), '[^0-9]') THEN 9999999 ELSE CAST(REGEXP_SUBSTR(SMP_CD, '[^-]+$') AS BIGINT) END")
//    			.orderByAsc(BusinessAssayTaskDetailDO::getSampleCode)
    			);
    }
    
    default List<BusinessAssayTaskDetailExtendRespVO> selectList(BusinessAssayTaskDetailReqVO reqVO) {
    	return selectJoinList(BusinessAssayTaskDetailExtendRespVO.class, new MPJLambdaWrapperX<BusinessAssayTaskDetailDO>()
        		.leftJoin(BusinessAssayTaskDataDO.class, BusinessAssayTaskDataDO::getId, BusinessAssayTaskDetailDO::getBusinessAssayTaskDataId)
        		.selectAll(BusinessAssayTaskDetailDO.class)
        		.selectAs(BusinessAssayTaskDetailDO::getSampleCode, BusinessAssayTaskDetailExtendRespVO::getSampleAssayCode)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessBaseSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessBaseSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessSubParentSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessSubParentSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getBusinessSubSampleId, BusinessAssayTaskDetailExtendRespVO::getBusinessSubSampleId)
        		.selectAs(BusinessAssayTaskDataDO::getConfigAssayMethodId, BusinessAssayTaskDetailExtendRespVO::getConfigAssayMethodId)
        		.selectAs(BusinessAssayTaskDataDO::getTaskType, BusinessAssayTaskDetailExtendRespVO::getTaskType)
        		.selectAs(BusinessAssayTaskDataDO::getAssayType, BusinessAssayTaskDetailExtendRespVO::getAssayType)
        		.selectAs(BusinessAssayTaskDataDO::getAssayProject, BusinessAssayTaskDetailExtendRespVO::getAssayProject)
        		.selectAs(BusinessAssayTaskDataDO::getAssayOperator, BusinessAssayTaskDetailExtendRespVO::getAssayOperator)
        		.selectAs(BusinessAssayTaskDataDO::getAssayDepartmentId, BusinessAssayTaskDetailExtendRespVO::getAssayDepartmentId)
        		.selectAs(BusinessAssayTaskDataDO::getAssayDepartmentName, BusinessAssayTaskDetailExtendRespVO::getAssayDepartmentName)
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskDataId, reqVO.getBusinessAssayTaskDataId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskId, reqVO.getBusinessAssayTaskId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSampleId, reqVO.getSampleId())
                .eqIfPresent(BusinessAssayTaskDetailDO::getTaskNo, reqVO.getTaskNo())
                .likeIfPresent(BusinessAssayTaskDetailDO::getSampleName, reqVO.getSampleName())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSampleCode, reqVO.getSampleCode())
                .eqIfPresent(BusinessAssayTaskDetailDO::getCupNumber, reqVO.getCupNumber())
                .eqIfPresent(BusinessAssayTaskDetailDO::getDataSourceType, reqVO.getDataSourceType())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSortNo, reqVO.getSortNo())
                .eqIfPresent(BusinessAssayTaskDetailDO::getRollbackStatus, reqVO.getRollbackStatus())
                .eqIfPresent(BusinessAssayTaskDetailDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .betweenIfPresent(BusinessAssayTaskDetailDO::getCreateTime, reqVO.getCreateTime())
                .eqIfPresent(BusinessAssayTaskDetailDO::getRemark, reqVO.getRemark())
                .orderByAsc("NVL(REGEXP_SUBSTR(SMP_CD, '^(.*-)'), SMP_CD)")
                .orderByAsc("CASE WHEN INSTR(SMP_CD, '-') = 0 THEN 0 WHEN REGEXP_LIKE(REGEXP_SUBSTR(SMP_CD, '[^-]+$'), '[^0-9]') THEN 9999999 ELSE CAST(REGEXP_SUBSTR(SMP_CD, '[^-]+$') AS BIGINT) END")
//    			.orderByAsc(BusinessAssayTaskDetailDO::getSampleCode)
    			);
    }

	default List<BusinessAssayTaskDetailDO> selectByBusinessAssayTaskId(Long businessAssayTaskId) {
		return selectList(new MPJLambdaWrapperX<BusinessAssayTaskDetailDO>()
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskId, businessAssayTaskId)
                .orderByAsc("NVL(REGEXP_SUBSTR(SMP_CD, '^(.*-)'), SMP_CD)")
                .orderByAsc("CASE WHEN INSTR(SMP_CD, '-') = 0 THEN 0 WHEN REGEXP_LIKE(REGEXP_SUBSTR(SMP_CD, '[^-]+$'), '[^0-9]') THEN 9999999 ELSE CAST(REGEXP_SUBSTR(SMP_CD, '[^-]+$') AS BIGINT) END")
				);
	}
	
	default Long selectCountByBusinessAssayTaskId(Long businessAssayTaskId) {
		return selectCount(new LambdaQueryWrapperX<BusinessAssayTaskDetailDO>()
                .eqIfPresent(BusinessAssayTaskDetailDO::getBusinessAssayTaskId, businessAssayTaskId));
	}

    /**
     * 物理批量删除删除
     * @param idList
     * @return
     */
    int physicalDeleteByIds(@Param("idList") List<Long> idList);
}