From 4bc513be11e671caf20ec6013a51dee42c2ed96e Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 07 十一月 2026 18:31:26 +0800
Subject: [PATCH] fix(crm): 禁止物料类合同开票

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
index a05fd5f..c5b2327 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
@@ -28,6 +28,13 @@
 @Mapper
 public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
 
+    default CrmContractDO selectByNoForUpdate(String no) {
+        return selectOne(new LambdaQueryWrapperX<CrmContractDO>().eq(CrmContractDO::getNo, no).last("FOR UPDATE"));
+    }
+
+    default CrmContractDO selectByIdForUpdate(Long id) {
+        return selectOne(new LambdaQueryWrapperX<CrmContractDO>().eq(CrmContractDO::getId, id).last("FOR UPDATE"));
+    }
     default CrmContractDO selectByNo(String no) {
         return selectOne(CrmContractDO::getNo, no);
     }
@@ -80,6 +87,20 @@
                 .set(CrmContractDO::getAuditStatus, status)
                 .set(CrmContractDO::getReviewerId, reviewerId)
                 .set(CrmContractDO::getReviewerName, reviewerName)
+                .set(CrmContractDO::getReviewTime, LocalDateTime.now())
+                .set(CrmContractDO::getReviewRemark, reviewRemark));
+    }
+
+    /**
+     * BPM 瀹℃壒缁撴潫鍚庡洖鍐欏悎鍚岀姸鎬�
+     *
+     * 浠呭綋鍚堝悓浠嶅浜庛�屽鎵逛腑銆嶆椂鏇存柊锛岄伩鍏嶄笌鏃у鎵硅矾寰勯噸澶嶈鐩栥��
+     */
+    default int updateAuditStatusByBpm(Long id, Integer status, String reviewRemark) {
+        return update(null, new LambdaUpdateWrapper<CrmContractDO>()
+                .eq(CrmContractDO::getId, id)
+                .eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.PROCESS.getStatus())
+                .set(CrmContractDO::getAuditStatus, status)
                 .set(CrmContractDO::getReviewTime, LocalDateTime.now())
                 .set(CrmContractDO::getReviewRemark, reviewRemark));
     }
@@ -143,7 +164,9 @@
         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()));
+                    // notifyDays 鍙兘涓� null锛堝巻鍙查厤缃湭濉級锛屼负 null 鏃舵寜 0 澶╁鐞嗭紝閬垮厤鎷嗙 NPE
+                .between(CrmContractDO::getEndTime, beginOfToday,
+                        endOfToday.plusDays(config.getNotifyDays() != null ? config.getNotifyDays() : 0));
         } else if (CrmContractPageReqVO.EXPIRY_TYPE_EXPIRED.equals(pageReqVO.getExpiryType())) { // 宸插埌鏈�
             query.eq(CrmContractDO::getAuditStatus, CrmAuditStatusEnum.APPROVE.getStatus())
                     .lt(CrmContractDO::getEndTime, endOfToday);
@@ -178,7 +201,9 @@
         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()));
+                // notifyDays 鍙兘涓� null锛堝巻鍙查厤缃湭濉級锛屼负 null 鏃舵寜 0 澶╁鐞嗭紝閬垮厤鎷嗙 NPE
+                .between(CrmContractDO::getEndTime, beginOfToday,
+                        endOfToday.plusDays(config.getNotifyDays() != null ? config.getNotifyDays() : 0));
         return selectCount(query);
     }
 

--
Gitblit v1.9.3