From 7b5ab4f33889e02bd97ce0994b29b1dd0ed68009 Mon Sep 17 00:00:00 2001
From: 6c <420680616@qq.com>
Date: 星期一, 22 九月 2025 15:48:43 +0800
Subject: [PATCH] 请求历史特殊处理-若是多次维修导致报表库数据重复,那么按照主键取最新数据

---
 product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java |   46 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java b/product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java
index 3857fe2..948c09f 100644
--- a/product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java
+++ b/product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java
@@ -18,6 +18,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
@@ -172,12 +173,13 @@
                                     // 妫�鏌ユ槸鍚︽墍鏈夎〃閮藉瓨鍦紝鑻ユ槸涓嶅瓨鍦紝閭d箞鍒涘缓
                                     checkTableIfNoThenCreate(monthMap.keySet(), reportTableNamePrefix, createTableService);
 
-                                    String querySql = joinReportDbQuerySql(monthMap, reportTableNamePrefix, sourceInfo);
+                                    String querySql = joinReportDbQuerySql(monthMap, reportTableNamePrefix, sourceInfo, singleSubDbTableInfoObj.getString("auto_field"));
                                     DataTableEntity reportDbExistsDte = reportDbe.getDao().getList(querySql);
                                     for (int i = 0; i < reportDbExistsDte.getRows(); i++) {
                                         FieldSetEntity reportDbExistsFse = reportDbExistsDte.getFieldSetEntity(i);
                                         for (Map<String, FieldSetEntity> singleMonthMap : monthMap.values()) {
-                                            singleMonthMap.remove(reportDbExistsFse.getString("pre_master_key"));
+                                            singleMonthMap.remove(formatNumberString(reportDbExistsFse.getString("pre_master_key")));
+                                            singleMonthMap.remove(formatNumberString(reportDbExistsFse.getString(singleSubDbTableInfoObj.getString("auto_field"))));
                                         }
                                     }
                                     for (Map.Entry<String, Map<String, FieldSetEntity>> entry : monthMap.entrySet()) {
@@ -206,6 +208,30 @@
                 stop(subDbe, reportDbe);
                 SpringMVCContextHolder.getSystemLogger().info("[璇锋眰鍘嗗彶鐗规畩澶勭悊-缁撴潫]");
             }
+        }
+    }
+
+    /**
+     * 鍒ゆ柇瀛楃涓叉槸鍚︿负鏁板瓧锛堟暣鏁版垨灏忔暟锛夛紝濡傛灉鏄紝鍒欏幓鎺夋湯灏惧浣欑殑0锛堝彲鑳藉悓鏃跺幓鎺夊皬鏁扮偣锛�
+     * @param str 杈撳叆瀛楃涓�
+     * @return 鏍煎紡鍖栧悗鐨勫瓧绗︿覆锛屽鏋滀笉鏄暟瀛楀垯杩斿洖鍘熷瓧绗︿覆
+     */
+    private String formatNumberString(String str) {
+        if (str == null) {
+            return null;
+        }
+
+        try {
+            // 浣跨敤 BigDecimal 瑙f瀽锛屽畠鑳藉鐞嗘暣鏁般�佸皬鏁般�佺瀛﹁鏁版硶绛�
+            BigDecimal bd = new BigDecimal(str);
+            // 鍘绘帀鏈熬鐨勯浂
+            bd = bd.stripTrailingZeros();
+
+            // 杞崲涓哄瓧绗︿覆锛堜娇鐢� toPlainString 閬垮厤绉戝璁℃暟娉曪級
+            return bd.toPlainString();
+        } catch (NumberFormatException e) {
+            // 濡傛灉涓嶆槸鏈夋晥鏁板瓧锛岃繑鍥炲師瀛楃涓�
+            return str;
         }
     }
 
@@ -357,18 +383,24 @@
      * @param monthMap              鏈堜唤map
      * @param reportTableNamePrefix 鎶ヨ〃搴撹〃鍚嶅墠缂�
      * @param sourceInfo            閲囬泦琛╥d
-     * @return  鎶ヨ〃搴撴煡璇㈣鍙�
+     * @param primaryKeyField       涓婚敭瀛楁
+     * @return 鎶ヨ〃搴撴煡璇㈣鍙�
      */
-    private String joinReportDbQuerySql(Map<String, Map<String, FieldSetEntity>> monthMap, String reportTableNamePrefix, String sourceInfo) {
+    private String joinReportDbQuerySql(Map<String, Map<String, FieldSetEntity>> monthMap, String reportTableNamePrefix, String sourceInfo, String primaryKeyField) {
         StringBuilder sql = new StringBuilder(128);
-        String model = "SELECT * FROM %s_%s WHERE source_info='%s' AND %s";
+        String model1 = "SELECT * FROM %s_%s WHERE source_info='%s' AND %s\n";
+        String model2 = "SELECT * FROM %s_%s WHERE %s\n";
         for (Map.Entry<String, Map<String, FieldSetEntity>> entry : monthMap.entrySet()) {
             String month = entry.getKey();
             Set<String> masterKeySet = entry.getValue().keySet();
             if (sql.length() > 0) {
-                sql.append("\nUNION ALL\n");
+                sql.append("UNION ALL\n");
             }
-            sql.append(String.format(model, reportTableNamePrefix, month, sourceInfo, BaseUtil.buildQuestionMarkFilter("pre_master_key", masterKeySet.toArray(), true)));
+            String checkPreMasterKeyPart = BaseUtil.buildQuestionMarkFilter("pre_master_key", masterKeySet.toArray(), true);
+            String checkPrimaryKeyPart =  BaseUtil.buildQuestionMarkFilter(primaryKeyField, masterKeySet.toArray(), true);
+            sql.append(String.format(model1, reportTableNamePrefix, month, sourceInfo, checkPreMasterKeyPart));
+            sql.append("UNION ALL\n");
+            sql.append(String.format(model2, reportTableNamePrefix, month, checkPrimaryKeyPart));
         }
         return sql.toString();
     }

--
Gitblit v1.9.2