Просмотр исходного кода

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

lipf 3 месяцев назад
Родитель
Сommit
1ea7f53289
29 измененных файлов с 329 добавлено и 186 удалено
  1. 4 25
      authentication/src/main/resources/application-dev.yml
  2. 2 23
      authentication/src/main/resources/application-prod.yml
  3. 6 2
      commons/pom.xml
  4. 6 1
      commons/src/main/java/com/jzg/commons/config/BaseFeignConfig.java
  5. 38 0
      commons/src/main/java/com/jzg/commons/config/SeataXidFilter.java
  6. 6 1
      commons/src/main/java/com/jzg/commons/exception/GlobalExceptionHandler.java
  7. 5 2
      consoleStatistics/src/main/resources/application-dev.yml
  8. 4 0
      consoleStatistics/src/main/resources/application-prod.yml
  9. 7 2
      gateway/src/main/resources/application-dev.yml
  10. 8 1
      gateway/src/main/resources/application-prod.yml
  11. 7 4
      partner/src/main/resources/application-dev.yml
  12. 2 1
      partner/src/main/resources/application-prod.yml
  13. 2 22
      platform/src/main/resources/application-dev.yml
  14. 2 21
      platform/src/main/resources/application-prod.yml
  15. 1 1
      pom.xml
  16. 5 2
      tenant/costsorrule/src/main/resources/application-dev.yml
  17. 2 0
      tenant/costsorrule/src/main/resources/application-prod.yml
  18. 60 45
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/util/UploadUtil.java
  19. 9 3
      tenant/insurance/quotation-summary/pom.xml
  20. 16 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/SeataTestOrgClient.java
  21. 70 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/SeataTestController.java
  22. 5 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  23. 14 10
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  24. 8 6
      tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml
  25. 1 1
      tenant/organization/pom.xml
  26. 32 9
      tenant/organization/src/main/java/com/jzg/organization/controller/TestController.java
  27. 3 2
      tenant/organization/src/main/resources/application-dev.yml
  28. 1 1
      tenant/organization/src/main/resources/application-prod.yml
  29. 3 0
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 4 - 25
authentication/src/main/resources/application-dev.yml

@@ -6,10 +6,10 @@ spring:
       password:
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
   config:
     import:
       - nacos:mysql
@@ -17,28 +17,7 @@ spring:
       - nacos:minio
 config:
   sso: 0
-seata:
-  enabled: true
-  application-id: ${spring.application.name}
-  # 事务组的名称,对应service.vgroupMapping.default_tx_group=xxx中配置的default_tx_group
-  tx-service-group: default_tx_group
-  # 配置事务组与集群的对应关系
-  service:
-    vgroup-mapping:
-      # default_tx_group为事务组的名称,default为集群名称(与registry.conf中的一致)
-      default_tx_group: default
-    disable-global-transaction: false
-  registry:
-    type: nacos
-    nacos:
-      application: seata-server
-      server-addr: 192.168.5.250:8848
-      group: SEATA_GROUP
-      namespace: ba488f58-c785-49b4-9c02-b5d9b8a965a5
-      username:
-      password:
-      # registry.conf中,配置cluster名称
-      cluster: default
+
 wechat:
   open:
     properties:
@@ -48,4 +27,4 @@ wechat:
 feign:
   client:
     jzg-partner:
-      url: http://localhost:8087/
+      url: http://localhost:8087/

+ 2 - 23
authentication/src/main/resources/application-prod.yml

@@ -17,31 +17,10 @@ spring:
       - nacos:mysql
       - nacos:redisson
       - nacos:minio
+      - nacos:seata-server
 config:
   sso: 0
 
-#seata:
-#  enabled: true
-#  application-id: ${spring.application.name}
-#  # 事务组的名称,对应service.vgroupMapping.default_tx_group=xxx中配置的default_tx_group
-#  tx-service-group: default_tx_group
-#  # 配置事务组与集群的对应关系
-#  service:
-#    vgroup-mapping:
-#      # default_tx_group为事务组的名称,default为集群名称(与registry.conf中的一致)
-#      default_tx_group: default
-#    disable-global-transaction: false
-#  registry:
-#    type: nacos
-#    nacos:
-#      application: seata-server
-#      server-addr: 172.24.144.227:8848
-#      group: SEATA_GROUP
-#      namespace: f9ca025f-b5df-47a9-b3f6-15bcbad3ebd3
-#      username: nacos
-#      password: AnrNjNn6zCS3QdIy
-#      # registry.conf中,配置cluster名称
-#      cluster: default
 wechat:
   open:
     properties:
@@ -53,4 +32,4 @@ wechat:
 feign:
   client:
     jzg-partner:
-      url: http://172.24.144.227:8087/
+      url: http://172.24.144.227:8087/

+ 6 - 2
commons/pom.xml

@@ -136,6 +136,10 @@
             <artifactId>opentelemetry-api</artifactId>
             <version>1.41.0</version>
         </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-spring-boot-starter</artifactId>
+        </dependency>
 
         <!--Gson 转化-->
         <dependency>
@@ -163,8 +167,8 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <source>14</source>
-                    <target>14</target>
+                    <source>17</source>
+                    <target>17</target>
 <!--                    <annotationProcessorPaths>-->
 <!--                        <path>-->
 <!--                            <groupId>org.projectlombok</groupId>-->

+ 6 - 1
commons/src/main/java/com/jzg/commons/config/BaseFeignConfig.java

@@ -1,9 +1,11 @@
 package com.jzg.commons.config;
 
 import feign.RequestInterceptor;
+import io.seata.core.context.RootContext;
 import jakarta.servlet.http.HttpServletRequest;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.util.StringUtils;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -13,7 +15,6 @@ public class BaseFeignConfig {
 
     @Bean
     public RequestInterceptor requestInterceptor() {
-        //拦截器 设置Token
         return requestTemplate -> {
             RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
             if (requestAttributes instanceof ServletRequestAttributes) {
@@ -27,6 +28,10 @@ public class BaseFeignConfig {
                      requestTemplate.header("system_code", systemCode);
                 }
             }
+            String xid = RootContext.getXID();
+            if (StringUtils.hasText(xid)) {
+                requestTemplate.header(RootContext.KEY_XID, xid);
+            }
         };
     }
 

+ 38 - 0
commons/src/main/java/com/jzg/commons/config/SeataXidFilter.java

@@ -0,0 +1,38 @@
+package com.jzg.commons.config;
+
+import io.seata.core.context.RootContext;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class SeataXidFilter implements Filter {
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        String xid = httpRequest.getHeader(RootContext.KEY_XID);
+
+        if (StringUtils.hasText(xid) && !StringUtils.hasText(RootContext.getXID())) {
+            RootContext.bind(xid);
+            try {
+                chain.doFilter(request, response);
+            } finally {
+                RootContext.unbind();
+            }
+        } else {
+            chain.doFilter(request, response);
+        }
+    }
+}

+ 6 - 1
commons/src/main/java/com/jzg/commons/exception/GlobalExceptionHandler.java

@@ -2,16 +2,19 @@ package com.jzg.commons.exception;
 
 import com.jzg.commons.core.page.HttpResult;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.ConstraintViolationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
+import org.springframework.http.HttpStatus;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.ObjectError;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
 
 import java.sql.SQLIntegrityConstraintViolationException;
 import java.util.List;
@@ -84,9 +87,11 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(Exception.class)
     @ResponseBody
-    public HttpResult handleException(HttpServletRequest request, Exception e) {
+    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
+    public HttpResult handleException(HttpServletRequest request, HttpServletResponse response, Exception e) {
         String uri = request.getRequestURI();
         String method = request.getMethod();
+        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
         LOGGER.error("【系统异常】接口 [{}],[{}] 出错", method, uri, e);
         return HttpResult.error(500, "程序异常,请联系管理员");
     }

+ 5 - 2
consoleStatistics/src/main/resources/application-dev.yml

@@ -6,10 +6,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
   config:
     import:
       - nacos:mysql
@@ -20,6 +20,9 @@ spring:
 config:
   sso: 1
 
+seata:
+  enabled: false
+
 #银联API参数配置
 unionPay:
   api:

+ 4 - 0
consoleStatistics/src/main/resources/application-prod.yml

@@ -32,3 +32,7 @@ unionPay:
     publicKey: 0414bb7e9c3914bb65b85079b1dc6e1ca2a0ee04dd9bb55b2f8d31704a6dec0cca695739e128f9c931330e1c0f493be4d56244236434c9d344c4716ba64a4470ba
     privateKey: 24ebfde60aecb81214605050763926ec342c487859a8da57d5badcd3c1559336
 
+
+
+seata:
+  enabled: false

+ 7 - 2
gateway/src/main/resources/application-dev.yml

@@ -18,12 +18,14 @@ spring:
         import-check:
           enabled: false
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
 
     gateway:
+      httpclient:
+        response-timeout: 120000
       routes:
         - id: auth_route
           uri: http://localhost:8081/
@@ -158,3 +160,6 @@ spring:
                   - /partner/rule/**
                   - /partner/**
                   - /purchaseRecord/**
+
+seata:
+  enabled: false

+ 8 - 1
gateway/src/main/resources/application-prod.yml

@@ -95,6 +95,7 @@ spring:
                   - /newCarJudgeRules/**
                   - /sysDistributionSetting/**
                   - /organization/wechat/**
+                  - /signIn/**
 
         - id: summary_route
           uri: http://172.24.144.227:9898/
@@ -106,11 +107,14 @@ spring:
                   - /supplementOrder/**
                   - /order/carModel/**
                   - /unify/**
+                  - /homepage/**
                   - /order/taskImages/**
                   - /order/qrCode/**
                   - /orderTrack/**
                   - /feeAudit/**
                   - /adjust/**
+                  - /rightsGrant/**
+                  - /insOrderRights/**
 
         - id: costsorrule_route
           uri: http://172.24.144.227:8085/
@@ -152,4 +156,7 @@ spring:
     redisson:
       address: redis://172.24.144.227:6379
       password: 123456
-      database: 0
+      database: 0
+
+seata:
+  enabled: false

+ 7 - 4
partner/src/main/resources/application-dev.yml

@@ -2,19 +2,22 @@ spring:
   cloud:
     nacos:
       server-addr: 192.168.5.250:8848
-      username:
-      password:
+      username: nacos
+      password: nacos
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
   config:
     import:
       - nacos:mysql
       - nacos:redisson
 
+seata:
+  enabled: false
+
 
 
 feign:

+ 2 - 1
partner/src/main/resources/application-prod.yml

@@ -15,7 +15,8 @@ spring:
       - nacos:mysql
       - nacos:redisson
 
-
+seata:
+  enabled: false
 
 
 feign:

+ 2 - 22
platform/src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
   config:
     import:
       - nacos:mysql
@@ -23,23 +23,3 @@ config:
   sso: 1
 
 
-seata:
-  tx:
-    service:
-      grouplist: 192.168.5.250:8091
-  application-id: platform-service
-  tx-service-group: my_global_tx_group  # 事务服务组
-  enable-auto-data-source-proxy: true  # 启用数据源代理
-  service:
-    vgroup-mapping:
-      my_global_tx_group: default  # 事务组与 Seata Server 绑定
-  store:
-    mode: db  # 存储模式,可以是 db 或 file 等
-    db:
-      datasource:
-        driver-class-name: com.mysql.cj.jdbc.Driver
-        url: jdbc:mysql://39.98.239.48:3306/seata
-        username: root
-        password: '@RqGHG#KZ*C9ytkQ'
-
-

+ 2 - 21
platform/src/main/resources/application-prod.yml

@@ -23,24 +23,5 @@ spring:
 config:
   sso: 1
 
-
-seata:
-  tx:
-    service:
-      grouplist: 172.24.144.227:8091
-  application-id: platform-service
-  tx-service-group: my_global_tx_group  # 事务服务组
-  enable-auto-data-source-proxy: true  # 启用数据源代理
-  service:
-    vgroup-mapping:
-      my_global_tx_group: default  # 事务组与 Seata Server 绑定
-  store:
-    mode: db  # 存储模式,可以是 db 或 file 等
-    db:
-      datasource:
-        driver-class-name: com.mysql.cj.jdbc.Driver
-        url: jdbc:mysql://39.98.239.48:3306/seata
-        username: root
-        password: '@RqGHG#KZ*C9ytkQ'
-
-
+graylog:
+  host: 172.24.144.227

+ 1 - 1
pom.xml

@@ -284,7 +284,7 @@
       <!--seata-->
       <dependency>
         <groupId>io.seata</groupId>
-        <artifactId>seata-all</artifactId>
+        <artifactId>seata-spring-boot-starter</artifactId>
         <version>${seata.version}</version>
       </dependency>
 

+ 5 - 2
tenant/costsorrule/src/main/resources/application-dev.yml

@@ -6,10 +6,10 @@ spring:
       password:
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
   config:
     import:
       - nacos:mysql
@@ -17,3 +17,6 @@ spring:
       - nacos:minio
       - nacos:rocketmq
 
+seata:
+  enabled: false
+

+ 2 - 0
tenant/costsorrule/src/main/resources/application-prod.yml

@@ -17,3 +17,5 @@ spring:
       - nacos:minio
       - nacos:rocketmq
 
+seata:
+  enabled: false

+ 60 - 45
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/util/UploadUtil.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.huatai.crawler.util;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ByteArrayResource;
 import org.springframework.core.io.FileSystemResource;
 import org.springframework.http.*;
 import org.springframework.stereotype.Service;
@@ -70,74 +71,75 @@ public class UploadUtil {
 
     /**
      * 压缩图片并返回 Base64(对应 Python 中的 ys_photo)
+     * 【已改造】无文件创建、纯内存流、保留压缩、返回新base64
      */
     public String ysPhoto(String base64Image) throws Exception {
+        // 1. Base64 解码成字节数组
         byte[] imageBytes = Base64.getDecoder().decode(base64Image);
-        File tempDir = new File(imagesPath + "huatai/");
-        if (!tempDir.exists()) {
-            tempDir.mkdirs();
-        }
-        File zzFile = File.createTempFile(imagesPath + "huatai/" + "upload_temp_zz", ".jpg", tempDir);
-        try (FileOutputStream fos = new FileOutputStream(zzFile)) {
-            fos.write(imageBytes);
-        }
 
-        BufferedImage img = ImageIO.read(zzFile);
+        // 2. 从内存流直接读取图片(不创建文件)
+        ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes);
+        BufferedImage img = ImageIO.read(bais);
+        bais.close();
+
         if (img == null) {
-            throw new IOException("无法读取图片: " + zzFile.getAbsolutePath());
+            throw new IOException("无法读取图片:字节流解析失败");
         }
+
+        // 3. 转 RGB 格式(去掉透明通道,原逻辑保留)
         BufferedImage rgbImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
         rgbImg.createGraphics().drawImage(img, 0, 0, null);
 
-        File sbFile = File.createTempFile(imagesPath + "huatai/" + "upload_temp_sb", ".jpg", tempDir);
+        // 4. 【重点】内存流压缩,不写文件!
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
         ImageWriteParam param = writer.getDefaultWriteParam();
+
+        // 保留压缩
         param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
         param.setCompressionQuality(0.4f);
-        try (FileImageOutputStream output = new FileImageOutputStream(sbFile)) {
-            writer.setOutput(output);
-            writer.write(null, new IIOImage(rgbImg, null, null), param);
-        } finally {
-            writer.dispose();
-        }
 
-        byte[] resultBytes;
-        try (FileInputStream fis = new FileInputStream(sbFile)) {
-            resultBytes = new byte[(int) sbFile.length()];
-            fis.read(resultBytes);
-        }
-        sbFile.delete();
-        tempDir.delete();
+        // 输出到内存流,不写文件
+        writer.setOutput(ImageIO.createImageOutputStream(baos));
+        writer.write(null, new IIOImage(rgbImg, null, null), param);
+
+        // 5. 清理
+        writer.dispose();
+        img.flush();
+        rgbImg.flush();
+
+        // 6. 压缩后的字节 -> 转 Base64 返回
+        byte[] resultBytes = baos.toByteArray();
+        baos.close();
+
         return Base64.getEncoder().encodeToString(resultBytes);
     }
 
     /**
      * 保存图片并返回尺寸和大小(对应 Python 中的 ys_photo_new)
+     * 【已改造】:不创建任何文件,纯流处理,解决服务器文件权限问题
      */
     public double[] ysPhotoNew(byte[] imageBytes, String imgName) throws Exception {
-        File tempDir = new File(imagesPath + "huatai/");
-        if (!tempDir.exists()) {
-            tempDir.mkdirs();
-        }
-        File originalFile = File.createTempFile(imagesPath + "huatai/" + "upload_temp_" + imgName, ".jpg", tempDir);
-        try (FileOutputStream fos = new FileOutputStream(originalFile)) {
-            fos.write(imageBytes);
-        }
+        // ===================== 1. 直接从字节数组读取图片(零文件) =====================
+        ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes);
+        BufferedImage img = ImageIO.read(bais);
+        bais.close();
 
-        BufferedImage img = ImageIO.read(originalFile);
         if (img == null) {
-            throw new IOException("无法读取图片: " + originalFile.getAbsolutePath());
+            throw new IOException("无法读取图片:字节流解析失败");
         }
 
-        String width = "";
-        String height = "";
-
+        // ===================== 2. 处理透明通道(不变) =====================
         if (img.getColorModel().hasAlpha() || img.getType() == BufferedImage.TYPE_BYTE_INDEXED) {
             BufferedImage rgbImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);
             rgbImg.createGraphics().drawImage(img, 0, 0, null);
             img = rgbImg;
         }
 
+        // ===================== 3. 缩放逻辑(你的原有逻辑,完全不变) =====================
+        String width = "";
+        String height = "";
+
         if (width != null && !width.isEmpty() || height != null && !height.isEmpty()) {
             int originalWidth = img.getWidth();
             int originalHeight = img.getHeight();
@@ -165,17 +167,21 @@ public class UploadUtil {
             img = resizedImg;
         }
 
-        File newFile = File.createTempFile(imagesPath + "huatai/" + imgName + "new", ".jpg", tempDir);
-        ImageIO.write(img, "jpg", newFile);
+        // ===================== 4. 【关键】纯流获取文件大小,不写磁盘 =====================
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ImageIO.write(img, "jpg", baos);
+        byte[] outputBytes = baos.toByteArray();
+        baos.close();
 
+        // 宽、高、大小(KB)—— 完全不需要文件
         int newWidth = img.getWidth();
         int newHeight = img.getHeight();
-        long fileSize = newFile.length();
-        double sizeKb = fileSize / 1024.0;
+        double sizeKb = outputBytes.length / 1024.0;
 
-        newFile.delete();
-        tempDir.delete();
+        // ===================== 5. 释放资源 =====================
+        img.flush();
 
+        // 返回和原来完全一样:[宽度,高度,大小KB]
         return new double[]{newWidth, newHeight, sizeKb};
     }
 
@@ -281,7 +287,7 @@ public class UploadUtil {
         double[] whSize = ysPhotoNew(originalBytes, filename);
         double fileSizeKb = whSize[2];
 
-        File uploadFile = new File(imagesPath + "huatai/" + filename + "new.jpg");
+        //File uploadFile = new File(imagesPath + "huatai/" + filename + "new.jpg");
 
         // 2. 上传文件
         HttpHeaders uploadHeaders = new HttpHeaders();
@@ -307,7 +313,16 @@ public class UploadUtil {
         String uploadUrl = "https://img-web.pc.ehuatai.com/app/ImgFileUpload/upload.do";
 
         MultiValueMap<String, Object> uploadBody = new LinkedMultiValueMap<>();
-        uploadBody.add("file", new FileSystemResource(uploadFile));
+        //uploadBody.add("file", new FileSystemResource(uploadFile));
+        // ByteArrayResource 代替 FileSystemResource,不需要创建文件
+        ByteArrayResource resource = new ByteArrayResource(originalBytes) {
+            @Override
+            public String getFilename() {
+                // 必须重写,否则上传文件名会为null
+                return filename + ".jpg";
+            }
+        };
+        uploadBody.add("file", resource);
         uploadBody.add("token", this.token);
         uploadBody.add("bucket", getUpdataValue("typeTreeNodeVo.bucket"));
         uploadBody.add("storageType", getUpdataValue("storageType"));

+ 9 - 3
tenant/insurance/quotation-summary/pom.xml

@@ -106,12 +106,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
-        <dependency>
+        <!--<dependency>
             <groupId>com.jzg</groupId>
             <artifactId>quotation-zijin</artifactId>
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
-        </dependency>
+        </dependency>-->
         <dependency>
             <groupId>com.jzg</groupId>
             <artifactId>quotation-hengbang</artifactId>
@@ -164,6 +164,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <!--<dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-yongan</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>-->
 
         <!-- thymeleaf 模版类 -->
         <dependency>
@@ -179,7 +185,7 @@
 
         <dependency>
             <groupId>io.seata</groupId>
-            <artifactId>seata-all</artifactId>
+            <artifactId>seata-spring-boot-starter</artifactId>
         </dependency>
     </dependencies>
     <build>

+ 16 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/SeataTestOrgClient.java

@@ -0,0 +1,16 @@
+package com.jzg.quotation.summary.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name = "jzg-organization", url = "http://localhost:8084/")
+public interface SeataTestOrgClient {
+
+    @GetMapping("/tenant/seataTestWrite")
+    HttpResult<String> seataTestWrite(@RequestParam("name") String name);
+
+    @GetMapping("/tenant/seataTestWriteFail")
+    HttpResult<String> seataTestWriteFail(@RequestParam("name") String name);
+}

+ 70 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/SeataTestController.java

@@ -0,0 +1,70 @@
+package com.jzg.quotation.summary.controller;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.quotation.summary.client.SeataTestOrgClient;
+import io.seata.core.context.RootContext;
+import io.seata.spring.annotation.GlobalTransactional;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/seataTest")
+public class SeataTestController {
+
+    private static final Logger log = LoggerFactory.getLogger(SeataTestController.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Autowired
+    private SeataTestOrgClient seataTestOrgClient;
+
+    @GetMapping("/success")
+    @GlobalTransactional(rollbackFor = Exception.class)
+    public HttpResult<String> testSuccess(@RequestParam(defaultValue = "test") String name) {
+        String xid = RootContext.getXID();
+        log.info("【quotation-summary 发起方】开启全局事务,XID=[{}]", xid);
+
+        jdbcTemplate.update("INSERT INTO seata_test (name, source) VALUES (?, ?)", name, "quotation-summary");
+        log.info("【quotation-summary 发起方】本地写入成功");
+
+        HttpResult<String> result = seataTestOrgClient.seataTestWrite(name);
+        log.info("【quotation-summary 发起方】远程调用 organization 结果:{}", result);
+
+        return HttpResult.ok("分布式事务测试-成功路径,XID=" + xid + ",org结果=" + result.getMsg());
+    }
+
+    @GetMapping("/rollback")
+    @GlobalTransactional(rollbackFor = Exception.class)
+    public HttpResult<String> testRollback(@RequestParam(defaultValue = "test") String name) {
+        String xid = RootContext.getXID();
+        log.info("【quotation-summary 发起方】开启全局事务(回滚测试),XID=[{}]", xid);
+
+        jdbcTemplate.update("INSERT INTO seata_test (name, source) VALUES (?, ?)", name, "quotation-summary-rollback");
+        log.info("【quotation-summary 发起方】本地写入成功,即将调用 organization 故意失败接口");
+
+        HttpResult<String> remoteResult = null;
+        try {
+            remoteResult = seataTestOrgClient.seataTestWriteFail(name);
+        } catch (Exception e) {
+            log.info("【quotation-summary 发起方】Feign 调用异常:{},分布式事务将回滚", e.getMessage());
+            throw e;
+        }
+
+        // 双重保障:即使 Feign 没抛异常,检查返回码,非 200 也触发回滚
+        if (remoteResult == null || remoteResult.getCode() != 200) {
+            String errMsg = remoteResult != null ? remoteResult.getMsg() : "远程调用返回为空";
+            log.info("【quotation-summary 发起方】远程调用返回错误码 [{}]:{},手动触发回滚",
+                    remoteResult != null ? remoteResult.getCode() : "null", errMsg);
+            throw new RuntimeException("远程调用失败: " + errMsg);
+        }
+
+        return HttpResult.ok("不会走到这里");
+    }
+}

+ 5 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -390,7 +390,11 @@ public class UnifyOrderManager {
             log.error("车险报价异常", e);
             Throwable root = e.getCause() != null ? e.getCause() : e;
             String errMsg = root.getMessage() != null ? root.getMessage() : "系统异常,报价失败";
-            insOrdersService.orderAfterUpdateFailedQuote(ordersNo, errMsg);
+            try {
+                insOrdersService.orderAfterUpdateFailedQuote(ordersNo, errMsg);
+            } catch (Exception ex) {
+                log.error("更新报价失败状态异常, ordersNo: {}", ordersNo, ex);
+            }
             throw new SystemException(errMsg);
         }
         return quoteResultsVo.getQuoteStatusEnum()

+ 14 - 10
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -6,10 +6,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
   config:
     import:
       - nacos:mysql
@@ -18,12 +18,16 @@ spring:
       - nacos:mongodb
       - nacos:identify
       - nacos:crawler-config
+      - nacos:rocketmq
+      - nacos:seata-server
   data:
     redis:
       host: 192.168.5.250
       port: 6379
       password: 123456  # 如果没有密码,可删除此行
       database: 0
+
+
 #百度图片识别API
 baidu:
   clientId: xG9M8tSjNvYPwSTNavM0ELlD
@@ -32,9 +36,9 @@ baidu:
   vehicle: https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_license
   idcard: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
 
-data-scope:
-  tables:
-    - sys_organization_user_link
+#data-scope:
+#  tables:
+#    - sys_organization_user_link
 
 
 image:
@@ -43,7 +47,7 @@ image:
 
 # 支付码相关配置
 qrcode:
-  genAddress: https://tennat.baoxianzhanggui.com/api/order/qrCode/index
+  genAddress: http://127.0.0.1:8001/order/qrCode/index
   imageSrc: http://127.0.0.1:8001/template/
 
 
@@ -135,12 +139,12 @@ huatai:
     sourceCode: '016'
     #    baseUrl: https://gears.pc.ehuatai.com:9003/interFaces/common/AutoInsuranceQuotation.do
     baseUrl: https://hound_t.pc.ehuatai.com/third/interFaces/common/AutoInsuranceQuotation.do
-    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBOtXf1T/no13LOuy5ti+/d+SADHns8hAv3+LjhDFsQRbHk3tHhnUNX7I8b25576AVmgraefS7jnpyB299f58PK8WkWZN+UB6pcyEpktrtqOnKcaQSTbkQzaseCW4sCRdoea0alzSXUuXC2FN0pHAE3JkT07e5doX3IHas2GJAkwIDAQAB
-    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAME61d/VP+ejXcs67Lm2L7935IAMeezyEC/f4uOEMWxBFseTe0eGdQ1fsjxvbnnvoBWaCtp59LuOenIHb31/nw8rxaRZk35QHqlzISmS2u2o6cpxpBJNuRDNqx4JbiwJF2h5rRqXNJdS5cLYU3SkcATcmRPTt7l2hfcgdqzYYkCTAgMBAAECgYAwAAWRDNBLInHyQjj8CR3jWk0Q4giHq7oJqnwaOIRud9zIxwIgym3ZXKRSDvxKnhQOSa3Yh+MblFEmcmJnsoQ4OedLq7FVOw1eur/nw6jMcROT6ZiP512ZGgKZI1OdkQDpjCqM9Vg1brrFuGdV2RwI9ak2bjKbi7vs6slvd4r3AQJBAOqU+5xkyuaupg9cO/7TIxMgnTQH8W7IC1uDcx3f28QdkP+udJYfU/n1dYyGuhkW66KVANSqz4dsrEiAmfhvydECQQDS304+LEvPi4j8YmNlOXrs1o8H0tPB69svC9ER2YbrTjZf49XvY9fuor11XAprXZhBp8yvJu07FuRWilrQ8FkjAkEAop1qmqzIdweE+ErxECJfQygtsd77v9cPAH5sM752Q0pXtNbD3TmUZkeBGExg/3mDGW5/Z+2M9Y0hFRWJJs6fsQJAO11mV5Z82Tb9H6BLPyoJczeMGLW/q65MjFgVSaMlmoTwRdqMVdKT7bifAbUhscwtmv40X3LkAmiVa8+TdZLUZQJACu2NgPZkw6gjKCZf5xOfvKaC3PqKlhPghq+ypyutzTih9y81+EBJ25emLWNcd5BtIZ/AXmr3UUiGg0zX4s5njA==
+    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYUuKVmeF5N66v6MQmOR8pt4o33yrio/ZrDf2ehk/kHJ2BYdI+xE9dLrZW5dm0y8yPpIHN39JaLuYOlWz5DVsWJTSPj9eaq0hOiY9BGAHJ3yMHdX3wygpcD11BVc5v4wbX/kyAhmatK69sb4zzAtEve1NS/YwZVuGch0CrkGw3YQIDAQAB
+    selfPrivateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJhS4pWZ4Xk3rq/oxCY5Hym3ijffKuKj9msN/Z6GT+QcnYFh0j7ET10utlbl2bTLzI+kgc3f0lou5g6VbPkNWxYlNI+P15qrSE6Jj0EYAcnfIwd1ffDKClwPXUFVzm/jBtf+TICGZq0rr2xvjPMC0S97U1L9jBlW4ZyHQKuQbDdhAgMBAAECgYAktOyXYoK8RFfbWjtSfrdsxScQub3K6foq6C8y8Wj1LpQiJqGUsJfze5tDK5agA/CiuODy7LnzM5QK9aVSCw7k0r8EeGpHcYRdLYZM0vXVFK2gIQctFemK4c6sg5p0Bn1LNRbJG7rgMMEA/OxcF6vyQahhFtPVtAQwc+dT0PV51QJBANd66rfTuxSRvIC/RE4W6iqzed2YZtx+0kd7KiN78Y4X6spposFCH4ALf4jUeRRXZAm+Qu71cq21m2GsQZ8bZdMCQQC096ilZXEjmEuvopQR3JvPbgAF+MtItusyDDsMR1CWwXq9XGMmxi6GhFY7r7C8b40j1IchVAEY5BcwxJwfjql7AkAp5QYZs5reBu/FgGqBXEcvAjIheW4WVLoBl9q7h2+RlujZbexs8rQ5KwMi0VyxLcSPeGR/HU2spHCPbvRbQPJtAkBANK4tIHSnwFz6D6ChRbgyPEDd3YuiXOPNefFpRdQd6L93d9Pl6eKP71v5CTiXYqyczcaz2G4bOrHPp7IMsD0JAkBO/q3ZMT+Nj2jdMn2AR1h+ngn38JnK46PznU0WoRPx72YoWbLxvaGWpu8scZAhpYeq/n+52NHFfu8ayDRNWjP2
     huaTaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYyF2SBNzLOP5N5fFW2T2eQ5+iaI5wVpsedu+UY290TVuG152tkdtSuTXsx+8BKnd79/PF966/2aSP4EUm7vD9kvQUnX2EDUiMooorGvDTRxoHNXFGqOtxdMiUOuqx19HwNb4gOXZ1WdjWJwSmqC6ZP6OgxKIotCHJwe826Q/w8wIDAQAB
-    huaTaiKey: e1YF83DYB8sj7gEr8M
+    huaTaiKey: AdOdn409KE6Z9XvFsJ
     key: kFl5aiHALbZ6TMTqQDxghMMC
-    tokenUrl: https://vehpxy.pc.ehuatai.com/testsign
+    tokenUrl: https://vehpxy.pc.ehuatai.com/sign
     username: "UE27017723VPN01"
     password: "Dhbx135....."
     comcode: "9270901-营业部代理业务一部"

+ 8 - 6
tenant/insurance/quotation-summary/src/main/resources/application-prod.yaml

@@ -18,6 +18,8 @@ spring:
       - nacos:mongodb
       - nacos:identify
       - nacos:crawler-config
+      - nacos:rocketmq
+      - nacos:seata-server
 
 #百度图片识别API
 baidu:
@@ -130,12 +132,12 @@ huatai:
     sourceCode: '016'
     #    baseUrl: https://gears.pc.ehuatai.com:9003/interFaces/common/AutoInsuranceQuotation.do
     baseUrl: https://hound_t.pc.ehuatai.com/third/interFaces/common/AutoInsuranceQuotation.do
-    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBOtXf1T/no13LOuy5ti+/d+SADHns8hAv3+LjhDFsQRbHk3tHhnUNX7I8b25576AVmgraefS7jnpyB299f58PK8WkWZN+UB6pcyEpktrtqOnKcaQSTbkQzaseCW4sCRdoea0alzSXUuXC2FN0pHAE3JkT07e5doX3IHas2GJAkwIDAQAB
-    selfPrivateKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAME61d/VP+ejXcs67Lm2L7935IAMeezyEC/f4uOEMWxBFseTe0eGdQ1fsjxvbnnvoBWaCtp59LuOenIHb31/nw8rxaRZk35QHqlzISmS2u2o6cpxpBJNuRDNqx4JbiwJF2h5rRqXNJdS5cLYU3SkcATcmRPTt7l2hfcgdqzYYkCTAgMBAAECgYAwAAWRDNBLInHyQjj8CR3jWk0Q4giHq7oJqnwaOIRud9zIxwIgym3ZXKRSDvxKnhQOSa3Yh+MblFEmcmJnsoQ4OedLq7FVOw1eur/nw6jMcROT6ZiP512ZGgKZI1OdkQDpjCqM9Vg1brrFuGdV2RwI9ak2bjKbi7vs6slvd4r3AQJBAOqU+5xkyuaupg9cO/7TIxMgnTQH8W7IC1uDcx3f28QdkP+udJYfU/n1dYyGuhkW66KVANSqz4dsrEiAmfhvydECQQDS304+LEvPi4j8YmNlOXrs1o8H0tPB69svC9ER2YbrTjZf49XvY9fuor11XAprXZhBp8yvJu07FuRWilrQ8FkjAkEAop1qmqzIdweE+ErxECJfQygtsd77v9cPAH5sM752Q0pXtNbD3TmUZkeBGExg/3mDGW5/Z+2M9Y0hFRWJJs6fsQJAO11mV5Z82Tb9H6BLPyoJczeMGLW/q65MjFgVSaMlmoTwRdqMVdKT7bifAbUhscwtmv40X3LkAmiVa8+TdZLUZQJACu2NgPZkw6gjKCZf5xOfvKaC3PqKlhPghq+ypyutzTih9y81+EBJ25emLWNcd5BtIZ/AXmr3UUiGg0zX4s5njA==
+    selfPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYUuKVmeF5N66v6MQmOR8pt4o33yrio/ZrDf2ehk/kHJ2BYdI+xE9dLrZW5dm0y8yPpIHN39JaLuYOlWz5DVsWJTSPj9eaq0hOiY9BGAHJ3yMHdX3wygpcD11BVc5v4wbX/kyAhmatK69sb4zzAtEve1NS/YwZVuGch0CrkGw3YQIDAQAB
+    selfPrivateKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJhS4pWZ4Xk3rq/oxCY5Hym3ijffKuKj9msN/Z6GT+QcnYFh0j7ET10utlbl2bTLzI+kgc3f0lou5g6VbPkNWxYlNI+P15qrSE6Jj0EYAcnfIwd1ffDKClwPXUFVzm/jBtf+TICGZq0rr2xvjPMC0S97U1L9jBlW4ZyHQKuQbDdhAgMBAAECgYAktOyXYoK8RFfbWjtSfrdsxScQub3K6foq6C8y8Wj1LpQiJqGUsJfze5tDK5agA/CiuODy7LnzM5QK9aVSCw7k0r8EeGpHcYRdLYZM0vXVFK2gIQctFemK4c6sg5p0Bn1LNRbJG7rgMMEA/OxcF6vyQahhFtPVtAQwc+dT0PV51QJBANd66rfTuxSRvIC/RE4W6iqzed2YZtx+0kd7KiN78Y4X6spposFCH4ALf4jUeRRXZAm+Qu71cq21m2GsQZ8bZdMCQQC096ilZXEjmEuvopQR3JvPbgAF+MtItusyDDsMR1CWwXq9XGMmxi6GhFY7r7C8b40j1IchVAEY5BcwxJwfjql7AkAp5QYZs5reBu/FgGqBXEcvAjIheW4WVLoBl9q7h2+RlujZbexs8rQ5KwMi0VyxLcSPeGR/HU2spHCPbvRbQPJtAkBANK4tIHSnwFz6D6ChRbgyPEDd3YuiXOPNefFpRdQd6L93d9Pl6eKP71v5CTiXYqyczcaz2G4bOrHPp7IMsD0JAkBO/q3ZMT+Nj2jdMn2AR1h+ngn38JnK46PznU0WoRPx72YoWbLxvaGWpu8scZAhpYeq/n+52NHFfu8ayDRNWjP2
     huaTaiPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYyF2SBNzLOP5N5fFW2T2eQ5+iaI5wVpsedu+UY290TVuG152tkdtSuTXsx+8BKnd79/PF966/2aSP4EUm7vD9kvQUnX2EDUiMooorGvDTRxoHNXFGqOtxdMiUOuqx19HwNb4gOXZ1WdjWJwSmqC6ZP6OgxKIotCHJwe826Q/w8wIDAQAB
-    huaTaiKey: e1YF83DYB8sj7gEr8M
+    huaTaiKey: AdOdn409KE6Z9XvFsJ
     key: kFl5aiHALbZ6TMTqQDxghMMC
-    tokenUrl: https://vehpxy.pc.ehuatai.com/testsign
+    tokenUrl: https://vehpxy.pc.ehuatai.com/sign
     username: "UE27017723VPN01"
     password: "Dhbx135....."
     comcode: "9270901-营业部代理业务一部"
@@ -248,7 +250,7 @@ feign:
     jzg-partner:
       url: http://172.24.144.227:8087/
     jeecg-boot:
-      url: http://172.24.144.227:8082/jeecg-boot
+      url: https://life.baoxianzhanggui.com/locallive-pro-java
 # 和生活服务平台约定的appkey、appSeCret,用于获取token
 live:
   service:
@@ -258,4 +260,4 @@ live:
 localLive:
   base-url: http://192.168.1.108:8082/jeecg-boot
   app-key: _N7dxVy3UJQUNwvacEHUFPzZ63kGwSx1OxXablRXJ9g
-  app-secret: UByV_498NU1unnr3b0hvQtIKbRyIj0HGCkZXxxgzwAU
+  app-secret: UByV_498NU1unnr3b0hvQtIKbRyIj0HGCkZXxxgzwAU

+ 1 - 1
tenant/organization/pom.xml

@@ -55,7 +55,7 @@
 
         <dependency>
             <groupId>io.seata</groupId>
-            <artifactId>seata-all</artifactId>
+            <artifactId>seata-spring-boot-starter</artifactId>
         </dependency>
 
     </dependencies>

+ 32 - 9
tenant/organization/src/main/java/com/jzg/organization/controller/TestController.java

@@ -1,22 +1,45 @@
 package com.jzg.organization.controller;
 
-import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.core.page.HttpResult;
+import io.seata.core.context.RootContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping("/tenant")
 public class TestController {
 
-//    @Autowired
-//    TestClient testClient;
-//
-//    @GetMapping(value = "aa")
-//    public String aa(){
-//        HttpResult userPer = testClient.getUserPer();
-//        return JSONObject.toJSONString(userPer);
-//    }
+    private static final Logger log = LoggerFactory.getLogger(TestController.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @GetMapping("/seataTestWrite")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult<String> seataTestWrite(@RequestParam(defaultValue = "test") String name) {
+        String xid = RootContext.getXID();
+        log.info("【organization 参与方】收到请求,XID=[{}], name=[{}]", xid, name);
+
+        jdbcTemplate.update("INSERT INTO seata_test (name, source) VALUES (?, ?)", name, "organization");
+
+        return HttpResult.ok("organization 写入成功, XID=" + xid);
+    }
+
+    @GetMapping("/seataTestWriteFail")
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult<String> seataTestWriteFail(@RequestParam(defaultValue = "test") String name) {
+        String xid = RootContext.getXID();
+        log.info("【organization 参与方-故意失败】收到请求,XID=[{}], name=[{}]", xid, name);
+
+        jdbcTemplate.update("INSERT INTO seata_test (name, source) VALUES (?, ?)", name, "organization-fail");
+
+        throw new RuntimeException("organization 故意抛出异常,测试分布式事务回滚");
+    }
 }

+ 3 - 2
tenant/organization/src/main/resources/application-dev.yml

@@ -6,16 +6,17 @@ spring:
       password:
       config:
         file-extension: yaml
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
         group: DEFAULT_GROUP
       discovery:
-        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
+        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
   config:
     import:
       - nacos:mysql
       - nacos:redisson
       - nacos:minio
       - nacos:rocketmq
+      - nacos:seata-server
 
 config:
   sso: 1

+ 1 - 1
tenant/organization/src/main/resources/application-prod.yml

@@ -16,6 +16,7 @@ spring:
       - nacos:redisson
       - nacos:minio
       - nacos:rocketmq
+      - nacos:seata-server
 
 config:
   sso: 1
@@ -31,4 +32,3 @@ unionPay:
     bankCardVerifyUrl: https://test-api-open.chinaums.com/v1/datacenter/smartverification/encrypted/bankcard/verify
     publicKey: 0414bb7e9c3914bb65b85079b1dc6e1ca2a0ee04dd9bb55b2f8d31704a6dec0cca695739e128f9c931330e1c0f493be4d56244236434c9d344c4716ba64a4470ba
     privateKey: 24ebfde60aecb81214605050763926ec342c487859a8da57d5badcd3c1559336
-

+ 3 - 0
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -231,6 +231,9 @@
         ipi.sy_premium,
         ipi.jy_premium,
         ipi.tax_premium,
+        ipi.jq_receivable_premium,
+        ipi.sy_receivable_premium,
+        ipi.jy_receivable_premium,
         ipi.jq_supervise_costs_proportion,
         ipi.sy_supervise_costs_proportion,
         ipi.jy_supervise_costs_proportion,