package cn.iocoder.yudao.module.crm.dal.mysql.receivable; 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.MPJLambdaWrapperX; import cn.iocoder.yudao.module.crm.controller.admin.receivable.vo.plan.CrmReceivablePlanPageReqVO; import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO; import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO; 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.time.LocalDateTime; import java.util.Objects; /** * 回款计划 Mapper * * @author 芋道源码 */ @Mapper public interface CrmReceivablePlanMapper extends BaseMapperX { default CrmReceivablePlanDO selectMaxPeriodByContractId(Long contractId) { return selectOne(new MPJLambdaWrapperX() .eq(CrmReceivablePlanDO::getContractId, contractId) .orderByDesc(CrmReceivablePlanDO::getPeriod) .last("LIMIT 1")); } default PageResult selectPageByCustomerId(CrmReceivablePlanPageReqVO reqVO) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); if (Objects.nonNull(reqVO.getContractNo())) { // 根据合同编号检索 query.innerJoin(CrmContractDO.class, on -> on.like(CrmContractDO::getNo, reqVO.getContractNo()) .eq(CrmContractDO::getId, CrmReceivablePlanDO::getContractId)); } query.eq(CrmReceivablePlanDO::getCustomerId, reqVO.getCustomerId()) // 必须传递 .eqIfPresent(CrmReceivablePlanDO::getContractId, reqVO.getContractId()) .orderByDesc(CrmReceivablePlanDO::getPeriod); return selectJoinPage(reqVO, CrmReceivablePlanDO.class, query); } default PageResult selectPage(CrmReceivablePlanPageReqVO pageReqVO, Long userId) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 拼接数据权限的查询条件 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), CrmReceivablePlanDO::getId, userId, pageReqVO.getSceneType()); // 拼接自身的查询条件 query.selectAll(CrmReceivablePlanDO.class) .eqIfPresent(CrmReceivablePlanDO::getCustomerId, pageReqVO.getCustomerId()) .eqIfPresent(CrmReceivablePlanDO::getContractId, pageReqVO.getContractId()) .orderByDesc(CrmReceivablePlanDO::getPeriod); if (Objects.nonNull(pageReqVO.getContractNo())) { // 根据合同编号检索 query.innerJoin(CrmContractDO.class, on -> on.like(CrmContractDO::getNo, pageReqVO.getContractNo()) .eq(CrmContractDO::getId, CrmReceivablePlanDO::getContractId)); } // Backlog: 回款提醒类型 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); if (CrmReceivablePlanPageReqVO.REMIND_TYPE_NEEDED.equals(pageReqVO.getRemindType())) { // 待回款 // 查询条件:未回款 + 提醒时间 <= 当前时间(反过来即当前时间 >= 提醒时间,已经到达提醒的时间点) query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 .le(CrmReceivablePlanDO::getRemindTime, beginOfToday); // 今天开始提醒 } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_EXPIRED.equals(pageReqVO.getRemindType())) { // 已逾期 // 查询条件:未回款 + 回款时间 < 当前时间(反过来即当前时间 > 回款时间,已经过了回款时间点) query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 .lt(CrmReceivablePlanDO::getReturnTime, beginOfToday); // 已逾期 } else if (CrmReceivablePlanPageReqVO.REMIND_TYPE_RECEIVED.equals(pageReqVO.getRemindType())) { // 已回款 query.isNotNull(CrmReceivablePlanDO::getReceivableId); } return selectJoinPage(pageReqVO, CrmReceivablePlanDO.class, query); } default Long selectReceivablePlanCountByRemind(Long userId) { MPJLambdaWrapperX query = new MPJLambdaWrapperX<>(); // 我负责的 + 非公海 CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType(), CrmReceivablePlanDO::getId, userId, CrmSceneTypeEnum.OWNER.getType()); // 未回款 + 已逾期 + 今天开始提醒 LocalDateTime beginOfToday = LocalDateTimeUtil.beginOfDay(LocalDateTime.now()); query.isNull(CrmReceivablePlanDO::getReceivableId) // 未回款 .lt(CrmReceivablePlanDO::getReturnTime, beginOfToday) // 已逾期 .lt(CrmReceivablePlanDO::getRemindTime, beginOfToday); // 今天开始提醒 return selectCount(query); } }