package cn.iocoder.yudao.module.crm.dal.mysql.contract; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; 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.contract.vo.contract.CrmContractPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractConfigDO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; 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 org.apache.ibatis.annotations.Mapper; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * CRM 合同 Mapper * * @author dhb52 */ @Mapper public interface CrmContractMapper extends BaseMapperX { default CrmContractDO selectByNo(String no) { return selectOne(CrmContractDO::getNo, no); } default PageResult selectPageByCustomerId(CrmContractPageReqVO pageReqVO) { return selectPage(pageReqVO, new LambdaQueryWrapperX() .eq(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) .likeIfPresent(CrmContractDO::getName, pageReqVO.getName()) .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) .eqIfPresent(CrmContractDO::getBusinessId, pageReqVO.getBusinessId()) .orderByDesc(CrmContractDO::getId)); } default PageResult selectPageByBusinessId(CrmContractPageReqVO pageReqVO) { return selectPage(pageReqVO, new LambdaQueryWrapperX() .eq(CrmContractDO::getBusinessId, pageReqVO.getBusinessId()) .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) .likeIfPresent(CrmContractDO::getName, pageReqVO.getName()) .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) .eqIfPresent(CrmContractDO::getBusinessId, pageReqVO.getBusinessId()) .orderByDesc(CrmContractDO::getId)); } default PageResult selectPage(CrmContractPageReqVO pageReqVO, Long userId, CrmContractConfigDO config) { return selectPage(pageReqVO, userId, config, null); } /** * 分页查询(带客户权限过滤) * * @param pageReqVO 查询条件 * @param userId 用户ID * @param config 合同配置 * @param permittedCustomerIds 有权限的客户ID列表(null表示不限制) */ default PageResult selectPage(CrmContractPageReqVO pageReqVO, Long userId, CrmContractConfigDO config, List permittedCustomerIds) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 拼接数据权限的查询条件 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmContractDO::getId, userId, pageReqVO.getSceneType()); // 拼接自身的查询条件 query.selectAll(CrmContractDO.class) .likeIfPresent(CrmContractDO::getNo, pageReqVO.getNo()) .likeIfPresent(CrmContractDO::getName, pageReqVO.getName()) .eqIfPresent(CrmContractDO::getCustomerId, pageReqVO.getCustomerId()) .eqIfPresent(CrmContractDO::getBusinessId, pageReqVO.getBusinessId()) .eqIfPresent(CrmContractDO::getAuditStatus, pageReqVO.getAuditStatus()) .orderByDesc(CrmContractDO::getId); // 客户权限过滤 if (permittedCustomerIds != null) { if (CollUtil.isEmpty(permittedCustomerIds)) { return PageResult.empty(); } query.in(CrmContractDO::getCustomerId, permittedCustomerIds); } // Backlog: 即将到期的合同 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); if (CrmContractPageReqVO.EXPIRY_TYPE_ABOUT_TO_EXPIRE.equals(pageReqVO.getExpiryType())) { // 即将到期 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays())); } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 已到期 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) .lt(CrmContractDO::getEndTime, endOfToday); } return selectJoinPage(pageReqVO, CrmContractDO.class, query); } default Long selectCountByContactId(Long contactId) { return selectCount(CrmContractDO::getSignContactId, contactId); } default Long selectCountByBusinessId(Long businessId) { return selectCount(CrmContractDO::getBusinessId, businessId); } default Long selectCountByAudit(Long userId) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 我负责的 + 非公海 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); // 未审核 query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); return selectCount(query); } default Long selectCountByRemind(Long userId, CrmContractConfigDO config) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 我负责的 + 非公海 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), CrmContractDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); // 即将到期 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) // 必须审批通过! .between(CrmContractDO::getEndTime, beginOfToday, endOfToday.plusDays(config.getNotifyDays())); return selectCount(query); } default List selectListByCustomerIdOwnerUserId(Long customerId, Long ownerUserId) { return selectList(new LambdaQueryWrapperX() .eq(CrmContractDO::getCustomerId, customerId) .eq(CrmContractDO::getOwnerUserId, ownerUserId)); } default CrmContractDO selectByBusinessId(Long businessId) { return selectOne(CrmContractDO::getBusinessId, businessId); } default CrmContractDO selectByOrderId(Long orderId) { return selectOne(CrmContractDO::getOrderId, orderId); } default List selectListByCustomerId(Long customerId) { return selectList(CrmContractDO::getCustomerId, customerId); } // ========== 统计方法 ========== default Long selectTodayCount() { LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); LocalDateTime endOfToday = LocalDateTimeUtil.endOfDay(LocalDateTime.now()); return selectCount(new LambdaQueryWrapperX() .between(CrmContractDO::getCreateTime, beginOfToday, endOfToday)); } default BigDecimal selectTotalPriceSum() { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); query.select(CrmContractDO::getTotalPrice); List list = selectList(query); return list.stream() .map(CrmContractDO::getTotalPrice) .filter(p -> p != null) .reduce(BigDecimal.ZERO, BigDecimal::add); } default Long selectApproveCount() { return selectCount(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()); } default BigDecimal selectApprovePriceSum() { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) .select(CrmContractDO::getTotalPrice); List list = selectList(query); return list.stream() .map(CrmContractDO::getTotalPrice) .filter(p -> p != null) .reduce(BigDecimal.ZERO, BigDecimal::add); } default Long selectProcessCount() { return selectCount(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus()); } default List selectOwnerUserIds() { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); query.select(CrmContractDO::getOwnerUserId).isNotNull(CrmContractDO::getOwnerUserId); List list = selectList(query); return list.stream().map(CrmContractDO::getOwnerUserId).distinct().toList(); } default Long selectCountByOwnerUserId(Long ownerUserId) { return selectCount(CrmContractDO::getOwnerUserId, ownerUserId); } default BigDecimal selectPriceSumByOwnerUserId(Long ownerUserId) { LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); query.eq(CrmContractDO::getOwnerUserId, ownerUserId).select(CrmContractDO::getTotalPrice); List list = selectList(query); return list.stream() .map(CrmContractDO::getTotalPrice) .filter(p -> p != null) .reduce(BigDecimal.ZERO, BigDecimal::add); } }