Browse Source

Merge remote-tracking branch 'origin/uat' into uat

zxfqwert 4 months ago
parent
commit
491cb5446f

+ 5 - 2
suishenbang-admin/src/main/resources/application-uat-druid.yml

@@ -6,9 +6,12 @@ spring:
         druid:
         druid:
             # 主库数据源
             # 主库数据源
             master:
             master:
-                url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#                url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#                username: ssbtest
+#                password: Ssbtest#0812
+                url: jdbc:mysql://pc-uf6y41z2eu263pi22.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: ssbtest
                 username: ssbtest
-                password: Ssbtest#0812
+                password: Ssbtest#0617
             # 从库数据源
             # 从库数据源
             slave:
             slave:
                 # 从数据源开关/默认关闭
                 # 从数据源开关/默认关闭

+ 6 - 2
suishenbang-admin/src/main/resources/application-uat.yml

@@ -35,10 +35,14 @@ hana:
   hana-url: jdbc:sap://hanaentsltp.nipponpaint.com.cn:30015?reconnect=true
   hana-url: jdbc:sap://hanaentsltp.nipponpaint.com.cn:30015?reconnect=true
   hana-user: SSB_HANA
   hana-user: SSB_HANA
   hana-pwd: Erty567*
   hana-pwd: Erty567*
+#  mysql-driver: com.mysql.jdbc.Driver
+#  mysql-url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#  mysql-user: ssbtest
+#  mysql-pwd: Ssbtest#0812
   mysql-driver: com.mysql.jdbc.Driver
   mysql-driver: com.mysql.jdbc.Driver
-  mysql-url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+  mysql-url: jdbc:mysql://pc-uf6y41z2eu263pi22.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
   mysql-user: ssbtest
   mysql-user: ssbtest
-  mysql-pwd: Ssbtest#0812
+  mysql-pwd: Ssbtest#0617
 
 
 qiyeweixin:
 qiyeweixin:
   #企业微信id
   #企业微信id

+ 13 - 9
suishenbang-api/src/main/resources/application-uat-druid.yml

@@ -6,16 +6,20 @@ spring:
         druid:
         druid:
             # 主库数据源
             # 主库数据源
             master:
             master:
-                url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#                url: jdbc:mysql://pc-uf637rafh16b6nl16.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+#                username: ssbtest
+#                password: Ssbtest#0812
+                url: jdbc:mysql://pc-uf6y41z2eu263pi22.rwlb.rds.aliyuncs.com:3306/ssbtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: ssbtest
                 username: ssbtest
-                password: Ssbtest#0812
+                password: Ssbtest#0617
+
             # 从库数据源
             # 从库数据源
             slave:
             slave:
                 # 从数据源开关/默认关闭
                 # 从数据源开关/默认关闭
                 enabled: false
                 enabled: false
-                url: 
-                username: 
-                password: 
+                url:
+                username:
+                password:
             # 初始连接数
             # 初始连接数
             initialSize: 5
             initialSize: 5
             # 最小连接池数量
             # 最小连接池数量
@@ -35,7 +39,7 @@ spring:
             testWhileIdle: true
             testWhileIdle: true
             testOnBorrow: false
             testOnBorrow: false
             testOnReturn: false
             testOnReturn: false
-            webStatFilter: 
+            webStatFilter:
                 enabled: true
                 enabled: true
             statViewServlet:
             statViewServlet:
                 enabled: true
                 enabled: true
@@ -43,8 +47,8 @@ spring:
                 allow:
                 allow:
                 url-pattern: /druid/*
                 url-pattern: /druid/*
                 # 控制台管理用户名和密码
                 # 控制台管理用户名和密码
-                login-username: 
-                login-password: 
+                login-username:
+                login-password:
             filter:
             filter:
                 stat:
                 stat:
                     enabled: true
                     enabled: true
@@ -54,4 +58,4 @@ spring:
                     merge-sql: true
                     merge-sql: true
                 wall:
                 wall:
                     config:
                     config:
-                        multi-statement-allow: true
+                        multi-statement-allow: true

+ 2 - 2
suishenbang-api/src/main/resources/application-uat.yml

@@ -7,8 +7,8 @@ ruoyi:
   # 版权年份
   # 版权年份
   copyrightYear: 2020
   copyrightYear: 2020
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-#  profile: /home/admin/project/file
-  profile: D:/ruoyi/uploadPath
+  profile: /home/admin/project/file
+  #  profile: D:/ruoyi/uploadPath
   # 获取ip地址开关
   # 获取ip地址开关
   addressEnabled: false
   addressEnabled: false
   #是否开启swagger
   #是否开启swagger

+ 2 - 2
suishenbang-api/src/main/resources/application.yml

@@ -1,5 +1,5 @@
 spring:
 spring:
   profiles:
   profiles:
-    active: uat
+    active: dev
 
 
-#开发环境dev 测试环境test 正式环境prod  启动时可以设置参数Java -jar xxxxxx.jar spring.profiles.actiove=prod
+#开发环境dev 测试环境test 正式环境prod  启动时可以设置参数Java -jar xxxxxx.jar spring.profiles.actiove=prod

+ 245 - 107
suishenbang-sync/suishenbang-sync-common/src/main/java/com/dgtly/sync/service/HanaOrderComponent.java

@@ -19,6 +19,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 
 @Component
 @Component
 public class HanaOrderComponent {
 public class HanaOrderComponent {
@@ -259,7 +260,7 @@ public class HanaOrderComponent {
 
 
     }
     }
     /*批量插入*/
     /*批量插入*/
-    private void insertSalesOrderResult(ResultSet rs) throws Exception {
+  /*  private void insertSalesOrderResult(ResultSet rs) throws Exception {
         Connection conn = null;
         Connection conn = null;
         PreparedStatement pstm =null;
         PreparedStatement pstm =null;
         PreparedStatement pstm1 =null;
         PreparedStatement pstm1 =null;
@@ -276,7 +277,7 @@ public class HanaOrderComponent {
             if (rs.next()) {
             if (rs.next()) {
                 long i=0;
                 long i=0;
                 ResultSetMetaData rsmd = rs.getMetaData();
                 ResultSetMetaData rsmd = rs.getMetaData();
-                /*循环遍历数据,创建执行批量插入的sql语句*/
+                *//*循环遍历数据,创建执行批量插入的sql语句*//*
                 do {
                 do {
                     i++;
                     i++;
                     pstm.setString(1, rs.getString("VBELN"));
                     pstm.setString(1, rs.getString("VBELN"));
@@ -350,8 +351,7 @@ public class HanaOrderComponent {
                 }
                 }
             }
             }
         }
         }
-    }
-//电子单签收
+    }*/
 
 
     private int createDeliverSignatureTxt(ResultSet result) throws Exception {
     private int createDeliverSignatureTxt(ResultSet result) throws Exception {
         File file = null;
         File file = null;
@@ -1005,11 +1005,11 @@ public class HanaOrderComponent {
             Long endTime = System.currentTimeMillis();
             Long endTime = System.currentTimeMillis();
             log.info("生成selfDeliverOrder-TXT用时:" + (endTime - startTime) + "毫秒");
             log.info("生成selfDeliverOrder-TXT用时:" + (endTime - startTime) + "毫秒");
 
 
-            conn = getMysqlConnection();
+         /*   conn = getMysqlConnection();
             //生产表
             //生产表
             String sql = "TRUNCATE TABLE meta_hana_self_deliver_order";
             String sql = "TRUNCATE TABLE meta_hana_self_deliver_order";
             pstm = conn.prepareStatement(sql);
             pstm = conn.prepareStatement(sql);
-            pstm.execute();
+            pstm.execute();*/
         }catch (Exception e){
         }catch (Exception e){
             e.printStackTrace();
             e.printStackTrace();
         }finally {
         }finally {
@@ -1157,7 +1157,7 @@ public class HanaOrderComponent {
     }
     }
 
 
     /*批量插入*/
     /*批量插入*/
-    private void insertDeliverOrderResult(ResultSet rs) throws Exception {
+    /*private void insertDeliverOrderResult(ResultSet rs) throws Exception {
         Connection conn = null;
         Connection conn = null;
         PreparedStatement pstm =null;
         PreparedStatement pstm =null;
         PreparedStatement pstm1 =null;
         PreparedStatement pstm1 =null;
@@ -1175,7 +1175,7 @@ public class HanaOrderComponent {
                 long i =0;
                 long i =0;
                 ResultSetMetaData rsmd = rs.getMetaData();
                 ResultSetMetaData rsmd = rs.getMetaData();
                 int colNum = rsmd.getColumnCount();
                 int colNum = rsmd.getColumnCount();
-                /*循环遍历数据,创建执行批量插入的sql语句*/
+                *//*循环遍历数据,创建执行批量插入的sql语句*//*
                 do {
                 do {
                     pstm.setString(1, rs.getString("VBELN"));
                     pstm.setString(1, rs.getString("VBELN"));
                     pstm.setString(2, rs.getString("POSNR"));
                     pstm.setString(2, rs.getString("POSNR"));
@@ -1252,7 +1252,7 @@ public class HanaOrderComponent {
                 }
                 }
             }
             }
         }
         }
-    }
+    }*/
 
 
 
 
 
 
@@ -1298,6 +1298,7 @@ public class HanaOrderComponent {
         }catch (Exception e){
         }catch (Exception e){
             String name ="meta_hana_order_maabc订单C类标识表同步异常";
             String name ="meta_hana_order_maabc订单C类标识表同步异常";
             userOrderAuthorService.sendMailHanaWarning(name);
             userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name, e);
             e.printStackTrace();
             e.printStackTrace();
         }finally {
         }finally {
             if(pstm!=null){
             if(pstm!=null){
@@ -1342,6 +1343,7 @@ public class HanaOrderComponent {
         }catch (Exception e){
         }catch (Exception e){
             String name ="meta_hana_deliver_sign电子单签收表同步异常";
             String name ="meta_hana_deliver_sign电子单签收表同步异常";
             userOrderAuthorService.sendMailHanaWarning(name);
             userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name, e);
             e.printStackTrace();
             e.printStackTrace();
         }finally {
         }finally {
             if(pstm!=null){
             if(pstm!=null){
@@ -1366,48 +1368,93 @@ public class HanaOrderComponent {
 
 
 //订单
 //订单
     public void runLoadSalesOrder(){
     public void runLoadSalesOrder(){
-        //生产表
-        Connection conn = null;
-        PreparedStatement pstm =null;
-        try{
-            conn = getMysqlConnection();
-            String sql = "TRUNCATE TABLE meta_hana_sales_order";
-            pstm = conn.prepareStatement(sql);
-            pstm.execute();
-            String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_sales_order fields terminated by '$$' lines terminated by '\\n'";
-            long beginTime=System.currentTimeMillis();
-            int rows=this.bulkLoadFromInputStream(testSql, mergeGetStream(new File((Global.getTemdataPath()+"salesOrder/"))));
-            long endTime=System.currentTimeMillis();
-            log.info("importing salesOrder := "+rows+" rows data into mysql and cost "+(endTime-beginTime)+" ms!");
-            String result = HttpUtils.sendGet(orderGetDataHook);
-            log.info("清空salesOrder缓存:"+result);
-        }catch (Exception e){
-            String name ="meta_hana_sales_order订单表同步异常";
-            userOrderAuthorService.sendMailHanaWarning(name);
-            e.printStackTrace();
-        }finally {
-            if(pstm!=null){
+
+        try (
+                Connection conn = getMysqlConnection();
+                Statement stmt = conn.createStatement()
+        ) {
+            // 设置事务隔离级别
+            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+            // 开启事务
+            conn.setAutoCommit(false);
+
+            try {
+                // 1. 创建临时表
+                stmt.execute("CREATE TABLE IF NOT EXISTS meta_hana_sales_order_temp LIKE meta_hana_sales_order");
+
+                // 2. 加载数据到临时表
+                String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_sales_order_temp fields terminated by '$$' lines terminated by '\\n'";
+                long beginTime = System.currentTimeMillis();
+                String filePath = Global.getTemdataPath() + "salesOrder/";
+                try (InputStream inputStream = mergeGetStream(new File(filePath))) {
+                    int rows = this.bulkLoadFromInputStream(testSql, inputStream);
+                    long endTime = System.currentTimeMillis();
+                    log.info("importing salesOrder := {} rows data into mysql from {} and cost {} ms!", rows, filePath, (endTime - beginTime));
+                }
+
+                //删除旧表
+                try (Connection tempConn = getMysqlConnection();
+                     Statement tempStmt = tempConn.createStatement()) {
+                    tempStmt.execute("DROP TABLE IF EXISTS meta_hana_sales_order_old");
+                    log.info("成功删除旧表: meta_hana_sales_order_old");
+                } catch (Exception e) {
+                    log.error("删除旧表失败,表名: meta_hana_sales_order_old", e);
+                }
+
+                // 1. 先设置会话级锁等待超时为3秒
+                try (Statement timeOut = conn.createStatement()) {
+                    timeOut.execute("SET SESSION innodb_lock_wait_timeout = 3");
+                }
+
+                // 2. 执行RENAME并设置语句级超时(原子切换表(RENAME是原子操作))
+                try (Statement renameTable = conn.createStatement()) {
+                    renameTable.setQueryTimeout(3); // 语句执行超时3秒
+                    renameTable.execute("RENAME TABLE meta_hana_sales_order TO meta_hana_sales_order_old, " +
+                            "meta_hana_sales_order_temp TO meta_hana_sales_order");
+                }
+
+                // 提交事务
+                conn.commit();
+
+
+                // 清空缓存
+                String result = HttpUtils.sendGet(orderGetDataHook);
+                log.info("清空salesOrder缓存:{}", result);
+            } catch (Exception e) {
+                // 回滚事务
                 try {
                 try {
-                    pstm.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.rollback();
+                    // 清理临时表
+                    try {
+                        stmt.execute("DROP TABLE IF EXISTS meta_hana_sales_order_temp");
+                    } catch (SQLException ex) {
+                        log.error("清理临时表失败", ex);
+                    }
+                } catch (SQLException ex) {
+                    log.error("事务回滚失败", ex);
                 }
                 }
-            }
-            if(conn!=null){
+
+            } finally {
                 try {
                 try {
-                    conn.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.setAutoCommit(true);
+                } catch (SQLException ex) {
+                    log.error("恢复自动提交模式失败", ex);
                 }
                 }
             }
             }
+        } catch (Exception e) {
+            String name = "meta_hana_sales_order订单表同步异常";
+            userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name + ", 文件路径: " + Global.getTemdataPath() + "salesOrder/", e);
+            throw new RuntimeException(e);
         }
         }
-        //测试表
-//        String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table sap_hana_sales_order fields terminated by '?' lines terminated by '\\n'";
-        //生产表
+
+
+
     }
     }
 
 
+
+
+
     public void runLoadFreezeCustomer()throws Exception{
     public void runLoadFreezeCustomer()throws Exception{
         //生产表
         //生产表
         Connection conn = null;
         Connection conn = null;
@@ -1426,6 +1473,7 @@ public class HanaOrderComponent {
         } catch (SQLException e) {
         } catch (SQLException e) {
             String name ="meta_hana_not_freeze_customer 未冻结经销商表同步异常";
             String name ="meta_hana_not_freeze_customer 未冻结经销商表同步异常";
             userOrderAuthorService.sendMailHanaWarning(name);
             userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name, e);
             e.printStackTrace();
             e.printStackTrace();
         }finally {
         }finally {
             if(pstm!=null){
             if(pstm!=null){
@@ -1449,86 +1497,176 @@ public class HanaOrderComponent {
 
 
 
 
     public void runLoadSelfReviewedDeliverOrder()throws Exception{
     public void runLoadSelfReviewedDeliverOrder()throws Exception{
-        //生产表
-        Connection conn = null;
-        PreparedStatement pstm =null;
-        try {
-            conn = getMysqlConnection();
-            //生产表
-            String sql = "TRUNCATE TABLE meta_hana_self_deliver_order";
-            pstm = conn.prepareStatement(sql);
-            pstm.execute();
-            String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_self_deliver_order fields terminated by '$$' lines terminated by '\\n'";
-            long beginTime=System.currentTimeMillis();
-            int rows=this.bulkLoadFromInputStream(testSql, mergeGetStream(new File((Global.getTemdataPath()+"selfDeliverOrder/"))));
-            long endTime=System.currentTimeMillis();
-            log.info("importing selfDeliverOrder := "+rows+" rows data into mysql and cost "+(endTime-beginTime)+" ms!");
-        } catch (SQLException e) {
-            String name ="meta_hana_self_deliver_order 自提提前过账表同步异常";
-            userOrderAuthorService.sendMailHanaWarning(name);
-            e.printStackTrace();
-        }finally {
-            if(pstm!=null){
+        try (
+                Connection conn = getMysqlConnection();
+                Statement stmt = conn.createStatement()
+        ) {
+            // 设置事务隔离级别
+            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+            // 开启事务
+            conn.setAutoCommit(false);
+
+            try {
+                // 1. 创建临时表
+                stmt.execute("CREATE TABLE IF NOT EXISTS meta_hana_self_deliver_order_temp LIKE meta_hana_self_deliver_order");
+
+                // 2. 加载数据到临时表
+                String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_self_deliver_order_temp fields terminated by '$$' lines terminated by '\\n'";
+                long beginTime = System.currentTimeMillis();
+                String filePath = Global.getTemdataPath() + "selfDeliverOrder/";
+                try (InputStream inputStream = mergeGetStream(new File(filePath))) {
+                    int rows = this.bulkLoadFromInputStream(testSql, inputStream);
+                    long endTime = System.currentTimeMillis();
+                    log.info("importing selfDeliverOrder := {} rows data into mysql from {} and cost {} ms!", rows, filePath, (endTime - beginTime));
+                }
+
+                //删除旧表
+                try (Connection tempConn = getMysqlConnection();
+                     Statement tempStmt = tempConn.createStatement()) {
+                    tempStmt.execute("DROP TABLE IF EXISTS meta_hana_self_deliver_order_old");
+                    log.info("成功删除旧表: meta_hana_self_deliver_order_old");
+                } catch (Exception e) {
+                    log.error("删除旧表失败,表名: meta_hana_self_deliver_order_old", e);
+                }
+
+                // 1. 先设置会话级锁等待超时为3秒
+                try (Statement timeOut = conn.createStatement()) {
+                    timeOut.execute("SET SESSION innodb_lock_wait_timeout = 3");
+                }
+
+                // 2. 执行RENAME并设置语句级超时(原子切换表(RENAME是原子操作))
+                try (Statement renameTable = conn.createStatement()) {
+                    renameTable.setQueryTimeout(3); // 语句执行超时3秒
+                    renameTable.execute("RENAME TABLE meta_hana_self_deliver_order TO meta_hana_self_deliver_order_old, " +
+                            "meta_hana_self_deliver_order_temp TO meta_hana_self_deliver_order");
+                }
+
+
+                // 提交事务
+                conn.commit();
+
+
+
+            } catch (Exception e) {
+                // 回滚事务
                 try {
                 try {
-                    pstm.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.rollback();
+                    // 清理临时表
+                    try {
+                        stmt.execute("DROP TABLE IF EXISTS meta_hana_self_deliver_order_temp");
+                    } catch (SQLException ex) {
+                        log.error("清理临时表失败", ex);
+                    }
+                } catch (SQLException ex) {
+                    log.error("事务回滚失败", ex);
                 }
                 }
-            }
-            if(conn!=null){
+
+                throw new RuntimeException(e);
+            } finally {
                 try {
                 try {
-                    conn.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.setAutoCommit(true);
+                } catch (SQLException ex) {
+                    log.error("恢复自动提交模式失败", ex);
                 }
                 }
             }
             }
+        } catch (Exception e) {
+            String name = "meta_hana_self_deliver_order自提提前过账表同步异常";
+            userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name + ", 文件路径: " + Global.getTemdataPath() + "selfDeliverOrder/", e);
+            throw new RuntimeException(e);
         }
         }
+
+
     }
     }
 
 
 
 
     public void runLoadDeliverOrder() throws Exception{
     public void runLoadDeliverOrder() throws Exception{
-        Connection conn = null;
-        PreparedStatement pstm =null;
-        //测试表
-//        String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table sap_hana_deliver_order fields terminated by '?' lines terminated by '\\n'";
-        //生产表
-        try {
-            conn = getMysqlConnection();
-            //生产表
-            String sql = "TRUNCATE TABLE meta_hana_deliver_order";
-            pstm = conn.prepareStatement(sql);
-            pstm.execute();
-            String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_deliver_order fields terminated by '$$' lines terminated by '\\n'";
-            long beginTime=System.currentTimeMillis();
-            int rows=this.bulkLoadFromInputStream(testSql, mergeGetStream(new File((Global.getTemdataPath()+"deliverOrder/"))));
-            long endTime=System.currentTimeMillis();
-            log.info("importing deliverOrder := "+rows+" rows data into mysql and cost "+(endTime-beginTime)+" ms!");
-            String result = HttpUtils.sendGet(deliverGetDataHook);
-            log.info("清空deliverOrder缓存:"+result);
-        } catch (SQLException e) {
-            String name ="meta_hana_deliver_order 交货单表同步异常";
-            userOrderAuthorService.sendMailHanaWarning(name);
-            e.printStackTrace();
-        }finally {
-            if(pstm!=null){
+        try (
+                Connection conn = getMysqlConnection();
+                Statement stmt = conn.createStatement()
+        ) {
+            // 设置事务隔离级别
+            conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+            // 开启事务
+            conn.setAutoCommit(false);
+
+            try {
+                // 1. 创建临时表
+                stmt.execute("CREATE TABLE IF NOT EXISTS meta_hana_deliver_order_temp LIKE meta_hana_deliver_order");
+
+                // 2. 加载数据到临时表
+                String testSql = "LOAD DATA LOCAL INFILE 'testIO.txt' into table meta_hana_deliver_order_temp fields terminated by '$$' lines terminated by '\\n'";
+                long beginTime = System.currentTimeMillis();
+                String filePath = Global.getTemdataPath() + "deliverOrder/";
+                try (InputStream inputStream = mergeGetStream(new File(filePath))) {
+                    int rows = this.bulkLoadFromInputStream(testSql, inputStream);
+                    long endTime = System.currentTimeMillis();
+                    log.info("importing deliverOrder := {} rows data into mysql from {} and cost {} ms!", rows, filePath, (endTime - beginTime));
+                }
+
+                //删除旧表
+                try (Connection tempConn = getMysqlConnection();
+                     Statement tempStmt = tempConn.createStatement()) {
+                    tempStmt.execute("DROP TABLE IF EXISTS meta_hana_deliver_order_old");
+                    log.info("成功删除旧表: meta_hana_deliver_order_old");
+                } catch (Exception e) {
+                    log.error("删除旧表失败,表名: meta_hana_deliver_order_old", e);
+                }
+
+
+                // 1. 先设置会话级锁等待超时为3秒
+                try (Statement timeOut = conn.createStatement()) {
+                    timeOut.execute("SET SESSION innodb_lock_wait_timeout = 3");
+                }
+
+                // 2. 执行RENAME并设置语句级超时(原子切换表(RENAME是原子操作))
+                try (Statement renameTable = conn.createStatement()) {
+                    renameTable.setQueryTimeout(3); // 语句执行超时3秒
+                    renameTable.execute("RENAME TABLE meta_hana_deliver_order TO meta_hana_deliver_order_old, " +
+                            "meta_hana_deliver_order_temp TO meta_hana_deliver_order");
+                }
+
+
+                // 提交事务
+                conn.commit();
+
+
+
+                // 清空缓存
+                String result = HttpUtils.sendGet(orderGetDataHook);
+                log.info("清空deliverOrder缓存:{}", result);
+            } catch (Exception e) {
+                // 回滚事务
                 try {
                 try {
-                    pstm.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.rollback();
+                    // 清理临时表
+                    try {
+                        stmt.execute("DROP TABLE IF EXISTS meta_hana_deliver_order_temp");
+                    } catch (SQLException ex) {
+                        log.error("清理临时表失败", ex);
+                    }
+                } catch (SQLException ex) {
+                    log.error("事务回滚失败", ex);
                 }
                 }
-            }
-            if(conn!=null){
+
+                throw new RuntimeException(e);
+            } finally {
                 try {
                 try {
-                    conn.close();
-                } catch (SQLException e) {
-                    e.printStackTrace();
-                    throw new RuntimeException(e);
+                    conn.setAutoCommit(true);
+                } catch (SQLException ex) {
+                    log.error("恢复自动提交模式失败", ex);
                 }
                 }
             }
             }
+        } catch (Exception e) {
+            String name = "meta_hana_deliver_order订单表同步异常";
+            userOrderAuthorService.sendMailHanaWarning(name);
+            log.error(name + ", 文件路径: " + Global.getTemdataPath() + "deliverOrder/", e);
+            throw new RuntimeException(e);
         }
         }
+
+
+
+
     }
     }
 
 
     public static InputStream mergeGetStream(File sourceFile) throws FileNotFoundException {
     public static InputStream mergeGetStream(File sourceFile) throws FileNotFoundException {

+ 2 - 2
suishenbang-system/src/main/java/com/dgtly/system/service/impl/SysMagnetLogServiceImpl.java

@@ -72,8 +72,8 @@ public class SysMagnetLogServiceImpl implements ISysMagnetLogService
             //计算渠道看板、产品看板、会员看板的停留时长
             //计算渠道看板、产品看板、会员看板的停留时长
             //本次是主页、渠道看板、产品看板、会员看板、关闭数据看板
             //本次是主页、渠道看板、产品看板、会员看板、关闭数据看板
             if("主页".equals(sysMagnetLog.getMagnetName()) || "渠道看板".equals(sysMagnetLog.getMagnetName()) || "产品看板".equals(sysMagnetLog.getMagnetName()) || "会员看板".equals(sysMagnetLog.getMagnetName()) || "关闭数据看板".equals(sysMagnetLog.getMagnetName())
             if("主页".equals(sysMagnetLog.getMagnetName()) || "渠道看板".equals(sysMagnetLog.getMagnetName()) || "产品看板".equals(sysMagnetLog.getMagnetName()) || "会员看板".equals(sysMagnetLog.getMagnetName()) || "关闭数据看板".equals(sysMagnetLog.getMagnetName())
-                    || "好邦手主页".equals(sysMagnetLog.getMagnetName()) || "好邦手渠道看板".equals(sysMagnetLog.getMagnetName()) || "好邦手产品看板".equals(sysMagnetLog.getMagnetName()) || "好邦手会员看板".equals(sysMagnetLog.getMagnetName())
-                    || "随身邦主页".equals(sysMagnetLog.getMagnetName()) || "随身邦渠道看板".equals(sysMagnetLog.getMagnetName()) || "随身邦产品看板".equals(sysMagnetLog.getMagnetName()) || "随身邦会员看板".equals(sysMagnetLog.getMagnetName())){
+                    || "好邦手主页".equals(sysMagnetLog.getMagnetName()) || "好邦手渠道看板".equals(sysMagnetLog.getMagnetName()) || "好邦手产品看板".equals(sysMagnetLog.getMagnetName()) || "好邦手会员看板".equals(sysMagnetLog.getMagnetName())  || "好邦手关闭数据看板".equals(sysMagnetLog.getMagnetName())
+                    || "随身邦主页".equals(sysMagnetLog.getMagnetName()) || "随身邦渠道看板".equals(sysMagnetLog.getMagnetName()) || "随身邦产品看板".equals(sysMagnetLog.getMagnetName()) || "随身邦会员看板".equals(sysMagnetLog.getMagnetName())  || "随身邦关闭数据看板".equals(sysMagnetLog.getMagnetName())){
                //判断是哪个入口
                //判断是哪个入口
                 String agent="";
                 String agent="";
                 if(sysMagnetLog.getMagnetName().contains("好邦手")){
                 if(sysMagnetLog.getMagnetName().contains("好邦手")){