| | |
| | | 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.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.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | default CrmContractDO selectByNo(String no) { |
| | | return selectOne(CrmContractDO::getNo, no); |
| | | } |
| | | |
| | | /** |
| | | * 提交审批:置为审批中,并清空上一轮审核结果 |
| | | * |
| | | * 之所以用 UpdateWrapper 而非 updateById:MyBatis-Plus 默认的字段更新策略会忽略 null, |
| | | * 直接 updateById 无法把审核不通过后残留的审核人、审核时间、审核意见真正清空。 |
| | | * |
| | | * @param id 合同编号 |
| | | * @param status 目标状态(审批中) |
| | | * @return 影响行数 |
| | | */ |
| | | default int submitAndResetAuditInfo(Long id, Integer status) { |
| | | return update(null, new LambdaUpdateWrapper<CrmContractDO>() |
| | | .eq(CrmContractDO::getId, id) |
| | | .set(CrmContractDO::getAuditStatus, status) |
| | | .set(CrmContractDO::getReviewerId, null) |
| | | .set(CrmContractDO::getReviewerName, null) |
| | | .set(CrmContractDO::getReviewTime, null) |
| | | .set(CrmContractDO::getReviewRemark, null)); |
| | | } |
| | | |
| | | /** |
| | | * 审核:写入审核结果、审核人与审核意见 |
| | | * |
| | | * reviewRemark 允许为 null(审核通过时意见可选),故同样使用 UpdateWrapper 直写。 |
| | | * |
| | | * @param id 合同编号 |
| | | * @param status 目标状态(审核通过 / 审核不通过) |
| | | * @param reviewerId 审核人编号 |
| | | * @param reviewerName 审核人姓名 |
| | | * @param reviewRemark 审核意见 |
| | | * @return 影响行数 |
| | | */ |
| | | default int auditContract(Long id, Integer status, Long reviewerId, |
| | | String reviewerName, String reviewRemark) { |
| | | return update(null, new LambdaUpdateWrapper<CrmContractDO>() |
| | | .eq(CrmContractDO::getId, id) |
| | | .set(CrmContractDO::getAuditStatus, status) |
| | | .set(CrmContractDO::getReviewerId, reviewerId) |
| | | .set(CrmContractDO::getReviewerName, reviewerName) |
| | | .set(CrmContractDO::getReviewTime, LocalDateTime.now()) |
| | | .set(CrmContractDO::getReviewRemark, reviewRemark)); |
| | | } |
| | | |
| | | default PageResult<CrmContractDO> selectPageByCustomerId(CrmContractPageReqVO pageReqVO) { |
| | |
| | | } |
| | | |
| | | default PageResult<CrmContractDO> 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<CrmContractDO> selectPage(CrmContractPageReqVO pageReqVO, Long userId, CrmContractConfigDO config, List<Long> permittedCustomerIds) { |
| | | MPJLambdaWrapperX<CrmContractDO> query = new MPJLambdaWrapperX<>(); |
| | | // 拼接数据权限的查询条件 |
| | | CrmPermissionUtils.appendPermissionCondition(query, CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| | |
| | | .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()); |
| | |
| | | .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<CrmContractDO> 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<CrmContractDO>() |
| | | .between(CrmContractDO::getCreateTime, beginOfToday, endOfToday)); |
| | | } |
| | | |
| | | default BigDecimal selectTotalPriceSum() { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> 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<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus()) |
| | | .select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> 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<Long> selectOwnerUserIds() { |
| | | LambdaQueryWrapperX<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.select(CrmContractDO::getOwnerUserId).isNotNull(CrmContractDO::getOwnerUserId); |
| | | List<CrmContractDO> 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<CrmContractDO> query = new LambdaQueryWrapperX<>(); |
| | | query.eq(CrmContractDO::getOwnerUserId, ownerUserId).select(CrmContractDO::getTotalPrice); |
| | | List<CrmContractDO> list = selectList(query); |
| | | return list.stream() |
| | | .map(CrmContractDO::getTotalPrice) |
| | | .filter(p -> p != null) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | } |