package cn.iocoder.yudao.module.crm.dal.mysql.invoice; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.crm.controller.admin.invoice.vo.invoice.CrmInvoicePageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.invoice.CrmInvoiceDO; import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; import cn.iocoder.yudao.module.crm.enums.common.CrmSceneTypeEnum; import cn.iocoder.yudao.module.crm.util.CrmPermissionUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * 开票 Mapper * * @author 超级管理员 */ @Mapper public interface CrmInvoiceMapper extends BaseMapperX { default CrmInvoiceDO selectByNo(String no) { return selectOne(CrmInvoiceDO::getNo, no); } default PageResult selectPageByCustomerId(CrmInvoicePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() .eq(CrmInvoiceDO::getCustomerId, reqVO.getCustomerId()) // 必须传递 .eqIfPresent(CrmInvoiceDO::getNo, reqVO.getNo()) .eqIfPresent(CrmInvoiceDO::getContractId, reqVO.getContractId()) .orderByDesc(CrmInvoiceDO::getId)); } default PageResult selectPage(CrmInvoicePageReqVO pageReqVO, Long userId) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 拼接数据权限的查询条件 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_INVOICE.getType(), CrmInvoiceDO::getId, userId, pageReqVO.getSceneType()); // 拼接自身的查询条件 query.selectAll(CrmInvoiceDO.class) .eqIfPresent(CrmInvoiceDO::getNo, pageReqVO.getNo()) .eqIfPresent(CrmInvoiceDO::getContractId, pageReqVO.getContractId()) .eqIfPresent(CrmInvoiceDO::getAuditStatus, pageReqVO.getAuditStatus()) .orderByDesc(CrmInvoiceDO::getId); return selectJoinPage(pageReqVO, CrmInvoiceDO.class, query); } default Long selectCountByAudit(Long userId) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 我负责的 + 非公海 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_INVOICE.getType(), CrmInvoiceDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); // 未审核 query.eq(CrmInvoiceDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); return selectCount(query); } default List selectListByContractIdAndStatus(Long contractId, Collection auditStatuses) { return selectList(new LambdaQueryWrapperX() .eq(CrmInvoiceDO::getContractId, contractId) .in(CrmInvoiceDO::getAuditStatus, auditStatuses)); } default Map selectInvoicePriceMapByContractId(Collection contractIds) { if (CollUtil.isEmpty(contractIds)) { return Collections.emptyMap(); } // SQL sum 查询 List> result = selectMaps(new QueryWrapper() .select("contract_id, SUM(price) AS total_price") .eq("audit_status", CrmAuditStatusEnum.APPROVE.getStatus()) .groupBy("contract_id") .in("contract_id", contractIds)); // 获得金额 return convertMap(result, obj -> (Long) obj.get("contract_id"), obj -> (BigDecimal) obj.get("total_price")); } default Long selectCountByContractId(Long contractId) { return selectCount(CrmInvoiceDO::getContractId, contractId); } }