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

import cn.hutool.core.collection.CollUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
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.MaterialUseEndReuseDetailPageReqVO;
import com.zt.plat.module.qms.resource.material.controller.vo.MaterialUseEndReuseDetailRespVO;
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.MaterialUseEndReuseDO;
import com.zt.plat.module.qms.resource.material.dal.dataobject.MaterialUseEndReuseDetailDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 物料用完标记或清洗回收明细 Mapper
 *
 * @author 后台管理
 */
@Mapper
public interface MaterialUseEndReuseDetailMapper extends BaseMapperX<MaterialUseEndReuseDetailDO> {

    default PageResult<MaterialUseEndReuseDetailDO> selectPage(MaterialUseEndReuseDetailPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MaterialUseEndReuseDetailDO>()
                .eqIfPresent(MaterialUseEndReuseDetailDO::getParentId, reqVO.getParentId())
                .eqIfPresent(MaterialUseEndReuseDetailDO::getInfomationId, reqVO.getInfomationId())
                .eqIfPresent(MaterialUseEndReuseDetailDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
                .eqIfPresent(MaterialUseEndReuseDetailDO::getRemark, reqVO.getRemark())
                .betweenIfPresent(MaterialUseEndReuseDetailDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(MaterialUseEndReuseDetailDO::getId));
    }

    default PageResult<MaterialUseEndReuseDetailRespVO> selectPageWithParentInfoAndMaterialInfo(MaterialUseEndReuseDetailPageReqVO reqVO, List<Long> pdtIds) {
        MPJLambdaWrapper<MaterialUseEndReuseDetailDO> wrapper = new MPJLambdaWrapperX<MaterialUseEndReuseDetailDO>()
                .select(MaterialUseEndReuseDetailDO::getId, MaterialUseEndReuseDetailDO::getCreateTime,
                        MaterialUseEndReuseDetailDO::getParentId, MaterialUseEndReuseDetailDO::getInfomationId,
                        MaterialUseEndReuseDetailDO::getProductId, MaterialUseEndReuseDetailDO::getMaterialName,
                        MaterialUseEndReuseDetailDO::getMaterialType, MaterialUseEndReuseDetailDO::getQuantity,
                        MaterialUseEndReuseDetailDO::getReuseDate, MaterialUseEndReuseDetailDO::getTreatmentStatus)
                .select(MaterialUseEndReuseDO::getBusinessType, MaterialUseEndReuseDO::getOperator, MaterialUseEndReuseDO::getOperatorId,
                        MaterialUseEndReuseDO::getOperatorDate, MaterialUseEndReuseDO::getRemark,
                        MaterialUseEndReuseDO::getReuseId, MaterialUseEndReuseDO::getReuseName)
                .selectAs(MaterialInfomationDO::getCode, MaterialUseEndReuseDetailRespVO::getInfomationCode)
                .select(MaterialProductDO::getModelNo)
                .selectAs(MaterialProductDO::getName, MaterialUseEndReuseDetailRespVO::getInfomationName)
                .leftJoin(MaterialUseEndReuseDO.class, MaterialUseEndReuseDO::getId, MaterialUseEndReuseDetailDO::getParentId)
                .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseEndReuseDetailDO::getInfomationId)
                .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId)
                .eqIfExists(MaterialUseEndReuseDetailDO::getParentId, reqVO.getParentId())
                .eqIfExists(MaterialUseEndReuseDetailDO::getInfomationId, reqVO.getInfomationId())
                .eqIfExists(MaterialUseEndReuseDetailDO::getTreatmentStatus, reqVO.getTreatmentStatus())
                .eqIfExists(MaterialUseEndReuseDO::getBusinessType, reqVO.getBusinessType())
                .likeIfExists(MaterialUseEndReuseDO::getOperator, reqVO.getOperator())
                .eqIfExists(MaterialUseEndReuseDO::getOperatorId, reqVO.getOperatorId())
                // .between(MaterialUseEndReuseDO::getOperatorDate, reqVO.getOperatorDate())
                .likeIfExists(MaterialUseEndReuseDO::getRemark, reqVO.getRemark())

                .in(CollUtil.isNotEmpty(pdtIds), MaterialUseEndReuseDetailDO::getInfomationId, pdtIds)
                // .between(MaterialUseEndReuseDetailDO::getCreateTime, reqVO.getCreateTime())
                ;
        return selectJoinPage(reqVO, MaterialUseEndReuseDetailRespVO.class, wrapper);
    }

    default List<MaterialUseEndReuseDetailRespVO> selectListWithParentInfoAndMaterialInfoByParentIds(List<Long> parentIds) {
        MPJLambdaWrapper<MaterialUseEndReuseDetailDO> wrapper = new MPJLambdaWrapperX<MaterialUseEndReuseDetailDO>()
                .select(MaterialUseEndReuseDetailDO::getId, MaterialUseEndReuseDetailDO::getCreateTime,
                        MaterialUseEndReuseDetailDO::getParentId, MaterialUseEndReuseDetailDO::getInfomationId,
                        MaterialUseEndReuseDetailDO::getProductId, MaterialUseEndReuseDetailDO::getMaterialName,
                        MaterialUseEndReuseDetailDO::getMaterialType, MaterialUseEndReuseDetailDO::getQuantity)
                .select(MaterialUseEndReuseDO::getBusinessType, MaterialUseEndReuseDO::getOperator, MaterialUseEndReuseDO::getOperatorId,
                        MaterialUseEndReuseDO::getOperatorDate, MaterialUseEndReuseDO::getRemark)
                .selectAs(MaterialInfomationDO::getCode, MaterialUseEndReuseDetailRespVO::getInfomationCode)
                .select(MaterialProductDO::getModelNo)
                .selectAs(MaterialProductDO::getName, MaterialUseEndReuseDetailRespVO::getInfomationName)
                .leftJoin(MaterialUseEndReuseDO.class, MaterialUseEndReuseDO::getId, MaterialUseEndReuseDetailDO::getParentId)
                .leftJoin(MaterialInfomationDO.class, MaterialInfomationDO::getId, MaterialUseEndReuseDetailDO::getInfomationId)
                .leftJoin(MaterialProductDO.class, MaterialProductDO::getId, MaterialInfomationDO::getProductId)
                .in(MaterialUseEndReuseDetailDO::getParentId, parentIds);

        return selectJoinList(MaterialUseEndReuseDetailRespVO.class, wrapper);
    }
}