From c4409fac0044cc1efeda07b6a7709c3fde1aa9fe Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期六, 24 十月 2026 10:46:32 +0800
Subject: [PATCH] fix(仓储物流): ①出库新增临时跳过租户插件修复 SetOperationList 解析异常 ②库存预警查询补 warningLevel/warningStatus/warningTime/expectedShortageTime/suggestionType/suggestionContent 字段 ③currentStock 别名

---
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                           |   23 +++++++++++
 src/main/resources/mapper/CustomStorageWarningRecordMapper.xml                              |    8 +++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java |   23 ++++++++---
 src/main/java/com/ruoyi/common/handler/CustomTenantLineHandler.java                         |   10 +++++
 4 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/handler/CustomTenantLineHandler.java b/src/main/java/com/ruoyi/common/handler/CustomTenantLineHandler.java
index d1b6d54..f6b13da 100644
--- a/src/main/java/com/ruoyi/common/handler/CustomTenantLineHandler.java
+++ b/src/main/java/com/ruoyi/common/handler/CustomTenantLineHandler.java
@@ -26,8 +26,18 @@
         }
     }
 
+    /**
+     * 绾跨▼绾т复鏃跺拷鐣ュ紑鍏筹細鏌愪簺 insert 鍦烘櫙涓� jsqlparser 瑙f瀽浼氭姏
+     * ClassCastException: SetOperationList cannot be cast to PlainSelect锛�
+     * 鍙湪璇ョ嚎绋嬪唴涓存椂璺宠繃绉熸埛鎻掍欢锛坱enant_id 鐢� MybatisHandler 鑷姩濉厖淇濊瘉锛夈��
+     */
+    public static final ThreadLocal<Boolean> TEMP_IGNORE = new ThreadLocal<>();
+
     @Override
     public boolean ignoreTable(String tableName) {
+        if (Boolean.TRUE.equals(TEMP_IGNORE.get())) {
+            return true;
+        }
         // 鎸囧畾涓嶉渶瑕佹坊鍔犺繃婊ゆ潯浠剁殑琛�
         Set<String> ignoreTables = IgnoreTableConfig.IGNORE_TABLES;
         return ignoreTables.contains(tableName);
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
index 49f1f8b..ed008ac 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -42,6 +42,29 @@
     @TableField(exist = false)
     private String timeStr;
 
+    // ===== 搴撳瓨棰勮鐩稿叧灞曠ず瀛楁锛堟潵鑷� custom_storage_warning_record锛岄潪鏈〃瀛楁锛�=====
+    /** 褰撳墠搴撳瓨锛堥〉闈㈠垪 currentStock锛孲QL 閲岀敱 availableStock 鍒悕鑰屾潵锛� */
+    @TableField(exist = false)
+    private BigDecimal currentStock;
+    /** 棰勮绾у埆 */
+    @TableField(exist = false)
+    private String warningLevel;
+    /** 棰勮鐘舵�� */
+    @TableField(exist = false)
+    private String warningStatus;
+    /** 棰勮鏃堕棿 */
+    @TableField(exist = false)
+    private LocalDateTime warningTime;
+    /** 棰勮缂鸿揣鏃堕棿 */
+    @TableField(exist = false)
+    private LocalDateTime expectedShortageTime;
+    /** 寤鸿绫诲瀷 */
+    @TableField(exist = false)
+    private String suggestionType;
+    /** 寤鸿鍐呭 */
+    @TableField(exist = false)
+    private String suggestionContent;
+
     /**
      * 寰呭嚭搴撴暟閲�
      */
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index 897716f..0b60e7a 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.handler.CustomTenantLineHandler;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
 import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
@@ -81,13 +82,21 @@
                 .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                 .updateTime(LocalDateTime.now());
         ProcurementRecordOut saved = procurementRecordOut.build();
-        this.save(saved);
-        if (StringUtils.isNotEmpty(procurementRecordOutAdd.getRequisitionNum()) && saved.getId() != null) {
-            ProcurementRecordOut upd = ProcurementRecordOut.builder()
-                    .id(saved.getId())
-                    .requisitionNum(new BigDecimal(procurementRecordOutAdd.getRequisitionNum()))
-                    .build();
-            procurementRecordOutMapper.updateById(upd);
+        // 鍑哄簱鍐欏叆鏃朵复鏃惰烦杩囩鎴锋彃浠讹紝閬垮厤 jsqlparser 瑙f瀽寮傚父
+        // 锛圕lassCastException: SetOperationList cannot be cast to PlainSelect锛�
+        // tenant_id 鐢� MybatisHandler 鐨� strictInsertFill 鑷姩濉厖锛屼笉浼氫涪
+        CustomTenantLineHandler.TEMP_IGNORE.set(Boolean.TRUE);
+        try {
+            this.save(saved);
+            if (StringUtils.isNotEmpty(procurementRecordOutAdd.getRequisitionNum()) && saved.getId() != null) {
+                ProcurementRecordOut upd = ProcurementRecordOut.builder()
+                        .id(saved.getId())
+                        .requisitionNum(new BigDecimal(procurementRecordOutAdd.getRequisitionNum()))
+                        .build();
+                procurementRecordOutMapper.updateById(upd);
+            }
+        } finally {
+            CustomTenantLineHandler.TEMP_IGNORE.remove();
         }
         return 0;
     }
diff --git a/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml b/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml
index 6bfcb45..40d93b3 100644
--- a/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml
+++ b/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml
@@ -22,7 +22,13 @@
         sum(t1.tax_inclusive_total_price) as totalPrice,
         sum(t1.inbound_num) as inboundNum,
         sum(t1.inbound_num) as inboundNum0,
-        SUM(t1.inbound_num) - COALESCE(SUM(t2.inbound_num), 0) AS availableStock
+        SUM(t1.inbound_num) - COALESCE(SUM(t2.inbound_num), 0) AS currentStock,
+        ANY_VALUE(cswr.warning_level)        AS warningLevel,
+        ANY_VALUE(cswr.warning_status)       AS warningStatus,
+        ANY_VALUE(cswr.warning_time)         AS warningTime,
+        ANY_VALUE(cswr.expectedShortageTime) AS expectedShortageTime,
+        ANY_VALUE(cswr.suggestion_type)      AS suggestionType,
+        ANY_VALUE(cswr.suggestion_content)   AS suggestionContent
         from custom_storage t1
         left join procurement_record_out t2 on t1.id = t2.procurement_record_storage_id and t2.type = 3
         inner join custom_storage_warning_record cswr on t1.id = cswr.custom_storage_id

--
Gitblit v1.9.3