liujie
7 天以前 7342170db7dc39326698d39b74e1858502fd574a
Merge remote-tracking branch 'origin/master'
2个文件已删除
26个文件已修改
8个文件已添加
1247 ■■■■ 已修改文件
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/resources/application-prod.yml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/src/main/resources/application-dev.yml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/src/main/resources/application-prod.yml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/src/main/resources/application-test.yml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/src/main/resources/application.yml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
EurekaQYTTravel/src/main/resources/logback.xml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementQYTTravel/guns-admin/src/main/resources/application-prod.yml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MessagePushTravel/pom.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MessagePushTravel/src/main/java/com/sinata/push/util/URLUtil.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MessagePushTravel/src/main/java/com/sinata/push/util/echo/NettyServerController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
MessagePushTravel/src/main/resources/application.yml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/resources/application-dev.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/resources/application-produce.yml 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/main/resources/application-test.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserQYTTravel/guns-admin/src/test/sql/test.sql 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/src/main/resources/application-dev.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/src/main/resources/application-prod.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/src/main/resources/application-test.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/src/main/resources/application.yml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulQYTTravel/src/main/resources/logback.xml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java
@@ -183,7 +183,7 @@
     * @return
     */
    public static PayInfo tradePayOff1(TradePayOff1Data tradePayOff1Data) {
        tradePayOff1Data.setPartnerId("5400004");
        tradePayOff1Data.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004");
        tradePayOff1Data.setTimeout("72H");
        tradePayOff1Data.setScene("TRAFFIC");
        tradePayOff1Data.setCurrency("RMB");
@@ -200,7 +200,7 @@
        
        
        TradeRequest request = new TradeRequest<TradePayOff1Data>();
        request.setSceneId("1911676727023968256");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954795404533583872" : "1911676727023968256");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -391,7 +391,7 @@
        tradeOrderCreateData.setTimeout("72H");
        tradeOrderCreateData.setOrderAppId("52270015");
        tradeOrderCreateData.setChannelSource("GRJYCXWXXCX");
        tradeOrderCreateData.setPayPartnerId("5400004");
        tradeOrderCreateData.setPayPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004");
        tradeOrderCreateData.setCurrency("RMB");
        tradeOrderCreateData.setNeedLoginFlag("N");
        tradeOrderCreateData.setAccessMode("APP");
@@ -405,7 +405,7 @@
        
        
        TradeRequest request = new TradeRequest<TradeOrderCreateData>();
        request.setSceneId("1945688132719169536");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954793280550756352" : "1945688132719169536");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -457,7 +457,7 @@
        createOrderRequest.setChannelSource("GRJYCXWXXCX");
        
        TradeRequest request = new TradeRequest<CreateOrderRequest>();
        request.setSceneId("1948289607125864448");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954792737421942784" : "1948289607125864448");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -503,7 +503,7 @@
     * @return
     */
    public static PayInfo tradePayOff(TradePayOffData tradePayOffData) {
        tradePayOffData.setPartnerId("5400005");
        tradePayOffData.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401008" : "5400005");
        tradePayOffData.setTimeout("72H");
        tradePayOffData.setScene("TRAFFIC");
        tradePayOffData.setCurrency("RMB");
@@ -539,9 +539,9 @@
        
        
        TradeRequest request = new TradeRequest<TradePayOffData>();
        request.setSceneId("1774717104844095488");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954794605782913024" : "1774717104844095488");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(2);
        request.setConfigVersion("prod".equals(qianYunTongConfig.getActiveProfile()) ? 1 : 2);
        request.setRequestId(UUIDUtil.getRandomCode());
        request.setData(tradePayOffData);
        //请求路径
DriverQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/zhenglian/ZhengLianConfig.java
@@ -74,13 +74,13 @@
        }
        if("prod".equals(activeProfile)){
            this.url = "https://gateway.zqpay.com";
            this.appid = "";
            this.merchNo = "";
            this.encrpNo = "";
            this.signNo = "";
            this.cer = "";
            this.sm2 = "";
            this.password = "";
            this.appid = "3e06da1751ec1626b30f7703a088f298";
            this.merchNo = "B00000402";
            this.encrpNo = "1342935640";
            this.signNo = "1471742568";
            this.cer = "/etraffic/server/1342935640.cer";
            this.sm2 = "/etraffic/server/1342935640.sm2";
            this.password = "31028Mky";
        }
        return this;
    }
DriverQYTTravel/guns-admin/src/main/resources/application-prod.yml
@@ -29,13 +29,13 @@
                max-request-size: 100MB
                max-file-size: 100MB
    redis:
        host: 172.21.35.151
        port: 6512
        password: SC_cache@20#25
        host: 10.31.1.219
        port: 6410
        password: Qnz_jt@20#25
        database: 0
        timeout: 1000
        cluster:
            nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
            nodes: 10.31.1.219:6410,10.31.1.30:6410,10.31.1.97:6411
mybatis-plus:
    typeAliasesPackage: com.stylefeng.guns.modular
@@ -58,9 +58,9 @@
spring:
    datasource:
        url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
        username: traffic_scusr
        password: QYT_sc@20#25
        url: jdbc:mysql://10.31.9.146:8066/qnjt_ridingdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
        username: qnjt_ridingusr
        password: qnjtriding@Prom2025
        db-name: traffic_scdb #用来搜集数据库的所有表
        filters: wall,mergeStat
@@ -68,7 +68,11 @@
spring:
    data:
        mongodb:
            uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
            host: 10.31.204.66
            port: 27009
            username: qnjt_ridingmgdb
            password: qnjtriding@Prom2025
            database: qnjt_ridingmgdb
---
@@ -105,13 +109,13 @@
    masterSecret-dispatch: 111 #用于服务器端 API 调用时与 AppKey 配合使用达到鉴权的目的
qyt:
    socket_uri:
    socket_uri: http://10.31.182.13:6000
---
#支付回调地址
#正式环境
callbackPath: https://traffic.qytzt.cn/driver
callbackPath: https://traffic.qytzt.cn/chuxing/driver
---
#交通部推送数据功能开关
EurekaQYTTravel/pom.xml
@@ -69,7 +69,7 @@
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
@@ -78,5 +78,28 @@
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <spring.active>dev</spring.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.active>test</spring.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <spring.active>prod</spring.active>
            </properties>
        </profile>
    </profiles>
</project>
EurekaQYTTravel/src/main/resources/application-dev.yml
New file
@@ -0,0 +1,26 @@
server:
  port: 8000  #服务端口号
spring:
  profiles:
    active: dev
  application:
    name: eureka-center #服务名称
  security:
    basic:
      enable: true #开启基于HTTP basic的认证
    user: #配置用户的账号信息
      name: sinata
      password: sinata
eureka:
  instance:
    hostname: 127.0.0.1 #注册中心地址
  client:
    service-url: #客户端调用地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false #是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true)
    fetch-registry: false #是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息
  server:
    enable-self-preservation: false #禁用自我保护模式,服务不可用时及时从注册中心剔除
    eviction-interval-timer-in-ms: 4000
EurekaQYTTravel/src/main/resources/application-prod.yml
New file
@@ -0,0 +1,26 @@
server:
  port: 8000  #服务端口号
spring:
  profiles:
    active: prod
  application:
    name: eureka-center #服务名称
  security:
    basic:
      enable: true #开启基于HTTP basic的认证
    user: #配置用户的账号信息
      name: sinata
      password: sinata
eureka:
  instance:
    hostname: 127.0.0.1 #注册中心地址
  client:
    service-url: #客户端调用地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false #是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true)
    fetch-registry: false #是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息
  server:
    enable-self-preservation: false #禁用自我保护模式,服务不可用时及时从注册中心剔除
    eviction-interval-timer-in-ms: 4000
EurekaQYTTravel/src/main/resources/application-test.yml
New file
@@ -0,0 +1,26 @@
server:
  port: 8000  #服务端口号
spring:
  profiles:
    active: test
  application:
    name: eureka-center #服务名称
  security:
    basic:
      enable: true #开启基于HTTP basic的认证
    user: #配置用户的账号信息
      name: sinata
      password: sinata
eureka:
  instance:
    hostname: 127.0.0.1 #注册中心地址
  client:
    service-url: #客户端调用地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false #是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true)
    fetch-registry: false #是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息
  server:
    enable-self-preservation: false #禁用自我保护模式,服务不可用时及时从注册中心剔除
    eviction-interval-timer-in-ms: 4000
EurekaQYTTravel/src/main/resources/application.yml
@@ -1,27 +1,3 @@
server:
  port: 8000  #服务端口号
spring:
  profiles:
    active: dev
#    active: prod
  application:
    name: eureka-center #服务名称
  security:
    basic:
      enable: true #开启基于HTTP basic的认证
    user: #配置用户的账号信息
      name: sinata
      password: sinata
eureka:
  instance:
    hostname: 192.168.110.85 #注册中心地址
  client:
    service-url: #客户端调用地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false #是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true)
    fetch-registry: false #是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息
  server:
    enable-self-preservation: false #禁用自我保护模式,服务不可用时及时从注册中心剔除
    eviction-interval-timer-in-ms: 4000
    active: "@spring.active@"
EurekaQYTTravel/src/main/resources/logback.xml
New file
@@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="/etraffic/server/logs/eureka"/>
    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--1. 输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--2. 输出到文档-->
    <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/debug.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/info.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/warn.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/error.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件  -->
    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/all.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>
    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
    -->
    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <!-- 4  最终的策略:
                 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
        <logger name="com.stylefeng.guns.modular.system.dao" level="debug"/>
    </springProfile>
    <springProfile name="test">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
    </springProfile>
    <springProfile name="prod">
        <root level="info">
            <!-- 生产环境最好不配置console写文件 -->
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
    </springProfile>
</configuration>
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/WebConfig.java
@@ -206,7 +206,7 @@
            registrationBean.addInitParameter("edu.yale.its.tp.cas.client.filter.loginUrl", "https://testsso1.teamshub.com/login");
            registrationBean.addInitParameter("edu.yale.its.tp.cas.client.filter.validateUrl", "https://testsso1.teamshub.com/serviceValidate");
            registrationBean.addInitParameter("com.oncon.md.loginUrl", "https://testsso1.teamshub.com/sso-session/login");
            registrationBean.addInitParameter("edu.yale.its.tp.cas.client.filter.serverName", "http://192.168.110.111:8010");
            registrationBean.addInitParameter("edu.yale.its.tp.cas.client.filter.serverName", "http://127.0.0.1:8010");
        }
        if("test".equals(activeProfile)){
            registrationBean.setFilter(onconMDCasFilter);
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TSystemPriceController.java
@@ -305,10 +305,10 @@
        }
        if(null == one){
            one = systemPriceCityService.selectOne(new EntityWrapper<SystemPriceCity>().eq("areaCode", systemPriceCity.getAreaCode())
                    .eq("cityCode", systemPriceCity.getCityCode()).ne("flag", 3));
                    .eq("cityCode", systemPriceCity.getCityCode()).isNull("provinceCode").ne("flag", 3));
            if(null == one){
                one = systemPriceCityService.selectOne(new EntityWrapper<SystemPriceCity>().eq("areaCode", systemPriceCity.getAreaCode())
                        .ne("flag", 3));
                        .isNull("cityCode").isNull("provinceCode").ne("flag", 3));
                if(null != one){
                    return new ErrorTip(500, "不能重复添加城市");
                }
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java
@@ -1,6 +1,5 @@
package com.stylefeng.guns.modular.system.controller.system;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -96,11 +95,11 @@
        String onconParam = edu.yale.its.tp.cas.client.Util.getOnconParam(session);
        onconParam = new String(Base64.decodeBase64(onconParam), "UTF-8");
        LoginUser loginUser = JSON.parseObject(onconParam, LoginUser.class);
        log.info("session解析结果:" + JSON.toJSONString(loginUser));
        //获取菜单列表
        User user = userMapper.getByAccount(loginUser.getImUser());
        if (null == user) {
            logOut(request);
            log.info("用户不存在");
            return null;
        }
        ShiroUser shiroUser = shiro.shiroUser(user);
@@ -132,8 +131,6 @@
     */
    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    public String logOut(HttpServletRequest request) {
        request.getSession().invalidate();
        HttpUtil.get("https://passport.teamshub.com/logout?logouturl=https%3A%2F%2Fsso.teamshub.com%2Flogout%3Flogoutat%3Dhttps%253A%252F%252Ftraffic.qytzt.cn%253A443%252F");
        return REDIRECT + "/";
    }
    
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushURL.java
@@ -1,7 +1,9 @@
package com.stylefeng.guns.modular.system.util;
public class PushURL {
    public static String zull_user_url = "https://test-qncx.sitechcloud.com";
//    public static String zull_user_url = "http://192.168.110.85";
//    public static String zull_user_url = "https://test-qncx.sitechcloud.com/chuxing";
    public static String zull_user_url = "https://traffic.qytzt.cn/chuxing";
    public static String order_push_url = zull_user_url + "/driver/base/order/pushOrderState";
    public static String driver_auth_url = zull_user_url + "/driver/base/driver/sendsms";
    public static String withdraw_auth_url = zull_user_url + "/driver/base/withdrawal/withdrawalAudit";
ManagementQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java
@@ -161,7 +161,7 @@
    public QianYunTongConfig getQianYunTongConfig() {
        if("dev".equals(activeProfile)){
            this.appkey = "10001104";
            this.privateKeyPath = "C:\\Users\\Admin\\Desktop\\qyt\\private_key_test.pem";
            this.privateKeyPath = "C:\\Users\\39373\\Desktop\\黔云通\\private_key_test.pem";
            this.userName = "xiaofei";
            this.status = "1";
            this.setApiUrl("https://test-zhongtai.stqcloud.com:10070");
@@ -187,13 +187,13 @@
        }
        if("prod".equals(activeProfile)){
            this.setAppkey("10001104");
            this.setPrivateKeyPath("/root/server/app/key/private_key.pem");
            this.setPrivateKeyPath("/etraffic/server/private_key.pem");
            this.setUserName("xiwang");
            this.setStatus("1");
            this.setApiUrl("http://jjzhongtai.stqcloud.com:10010");
            this.setBucketName("qyt20250702");
            this.setAppId("wxcc3c9058e2b294db");
            this.setEndPoint("http://119.4.112.68:27741/v1");
            this.setEndPoint("http://10.30.52.45:27741/v1");
            this.setAccount("d8bef0a04db511f0b79d01a3e2b7587e");
            this.setAccessKey("TYMFTFD5SIIT15DCCUD7");
            this.setSecretKey("AoI1dkH3yoAvXoaQlREO3ed9mwQJFluLTliS9T1z");
ManagementQYTTravel/guns-admin/src/main/resources/application-dev.yml
@@ -56,7 +56,7 @@
spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/traveling_track
      uri: mongodb://192.168.110.80:27017/traveling_track
---
ManagementQYTTravel/guns-admin/src/main/resources/application-prod.yml
@@ -29,13 +29,13 @@
      max-request-size: 500MB
      max-file-size: 500MB
  redis:
    host: 172.21.35.151
    port: 6512
    password: SC_cache@20#25
    host: 10.31.1.219
    port: 6410
    password: Qnz_jt@20#25
    database: 0
    timeout: 1000
    cluster:
      nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
      nodes: 10.31.1.219:6410,10.31.1.30:6410,10.31.1.97:6410
mybatis-plus:
  type-aliases-package: com.stylefeng.guns.modular
@@ -49,9 +49,9 @@
---
spring:
  datasource:
    url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: traffic_scusr
    password: QYT_sc@20#25
    url: jdbc:mysql://10.31.9.146:8066/qnjt_ridingdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: qnjt_ridingusr
    password: qnjtriding@Prom2025
    db-name: traffic_scdb #用来搜集数据库的所有表
    filters: wall,mergeStat
@@ -60,7 +60,11 @@
spring:
  data:
    mongodb:
      uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
      host: 10.31.204.66
      port: 27009
      username: qnjt_ridingmgdb
      password: qnjtriding@Prom2025
      database: qnjt_ridingmgdb
---
@@ -81,13 +85,11 @@
  alipayPublicKey: 1111 #应用公钥
  alipay_public_key: 1111 #支付宝公钥
---
#支付回调地址
#正式环境
callbackPath: https://traffic.qytzt.cn
callbackPath: https://traffic.qytzt.cn/chuxing
#交通部推送数据功能开关
pushMinistryOfTransport: false
MessagePushTravel/pom.xml
@@ -91,5 +91,29 @@
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <spring.active>dev</spring.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.active>test</spring.active>
            </properties>
        </profile>
        <profile>
            <id>produce</id>
            <properties>
                <spring.active>produce</spring.active>
            </properties>
        </profile>
    </profiles>
</project>
MessagePushTravel/src/main/java/com/sinata/push/util/URLUtil.java
File was deleted
MessagePushTravel/src/main/java/com/sinata/push/util/echo/NettyServerController.java
@@ -5,6 +5,7 @@
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sinata.push.config.QYTConfig;
import com.sinata.push.util.*;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -33,18 +34,25 @@
    public static Hashtable<String, Hashtable<ChannelHandlerContext, String>> map = new Hashtable<String, Hashtable<ChannelHandlerContext,String>>();
    public static Hashtable<String,String> table;
    public static QYTConfig qytConfig;
    private RedisUtil redisUtil = SpringUtil.getObject(RedisUtil.class);
    
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    static{
        if(table == null){
            table = new Hashtable<>();
        }
    }
    public static void setQytConfig(QYTConfig qytConfig) {
        NettyServerController.qytConfig = qytConfig;
    }
    
    public static boolean isdebug = false;
@@ -201,7 +209,7 @@
                                params.put("lat", String.valueOf(lat));
                                params.put("directionAngle", String.valueOf(computeAzimuth));
                                params.put("altitude", String.valueOf(altitude));
                                HttpRequest post = HttpUtil.createPost(URLUtil.zuul + "/driver-server/base/savePosition");
                                HttpRequest post = HttpUtil.createPost(qytConfig.getChuxingUrl() + "/driver-server/base/savePosition");
                                post.contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
                                post.form(params);
                                HttpResponse execute = post.execute();
@@ -228,7 +236,7 @@
                            params.put("lat", String.valueOf(lat));
                            params.put("directionAngle", String.valueOf(computeAzimuth));
                            params.put("altitude", String.valueOf(altitude));
                            HttpRequest post = HttpUtil.createPost(URLUtil.aj_zuul + "/driver-server/base/driver/addDriverPosition");
                            HttpRequest post = HttpUtil.createPost(qytConfig.getDaijiaurl() + "/driver-server/base/driver/addDriverPosition");
                            post.contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
                            post.form(params);
                            HttpResponse execute = post.execute();
MessagePushTravel/src/main/resources/application.yml
@@ -2,23 +2,5 @@
  port: 6000
spring:
  profiles:
    active: dev
#    active: prod
  application:
    name: message #服务名称
  servlet:
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    host: 192.168.110.80
    port: 6379
    password: 123456
#    host: 10.88.154.24
#    port: 7560
#    password: Idcs_B_2025rd141
    database: 0
    timeout: 1000
#    cluster:
#      nodes: 10.88.154.24:7560,10.88.154.34:7560,10.88.154.59:7560,10.88.154.98:7560,10.88.154.100:7560,10.88.154.109:7560
    active: '@spring.active@'
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -2394,8 +2394,8 @@
            List<TripOrderVo> tripOrderVos = processTripOrderVos(orderList);
            String filePath = tripSheetGenerator.generatePdf(tripOrderVos);
            File attachment = new File(filePath);
            String displayFileName = "贵人家园行程单.pdf";
            emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "行程单", "请查收您的行程单", attachment,displayFileName);
            String displayFileName = "贵人家园出行-行程单.pdf";
            emailUtil.sendEmailWithAttachment(tripSheet.getRecipientEmail(), "贵人家园出行-行程单", "贵人家园出行-行程单", attachment,displayFileName);
            attachment.delete(); // 发送成功后删除临时文件
            Map<String, Object> result = new HashMap<>();
            result.put("orderNum", orderList.size());
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/UserInfoController.java
@@ -11,6 +11,7 @@
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.WeChatUtil;
import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil;
import com.stylefeng.guns.modular.system.warpper.LoginWarpper;
import com.stylefeng.guns.modular.system.warpper.UserInfoWarpper;
import com.stylefeng.guns.modular.system.warpper.VerifiedWarpper;
@@ -393,6 +394,12 @@
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            UserInfo userInfo = userInfoService.selectById(uid);
            if(ToolUtil.isEmpty(userInfo.getOnconUUID())){
                String onconUUIDByMobile = UserUtil.getOnconUUIDByMobile("15828353127");
                userInfo.setOnconUUID(onconUUIDByMobile);
                userInfoService.updateById(userInfo);
            }
            Map<String, Object> map = userInfoService.queryUserInfo(uid);
            UserWithdrawal userWithdrawal1 = userWithdrawalService.selectOne(new EntityWrapper<UserWithdrawal>()
                    .eq("phone", map.get("phone"))
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/OrderUtil.java
@@ -184,7 +184,7 @@
     * @return
     */
    public static PayInfo tradePayOff1(TradePayOff1Data tradePayOff1Data) {
        tradePayOff1Data.setPartnerId("5400004");
        tradePayOff1Data.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004");
        tradePayOff1Data.setTimeout("72H");
        tradePayOff1Data.setScene("TRAFFIC");
        tradePayOff1Data.setCurrency("RMB");
@@ -201,7 +201,7 @@
        
        
        TradeRequest request = new TradeRequest<TradePayOff1Data>();
        request.setSceneId("1911676727023968256");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954795404533583872" : "1911676727023968256");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -392,7 +392,7 @@
        tradeOrderCreateData.setTimeout("72H");
        tradeOrderCreateData.setOrderAppId("52270015");
        tradeOrderCreateData.setChannelSource("GRJYCXWXXCX");
        tradeOrderCreateData.setPayPartnerId("5400004");
        tradeOrderCreateData.setPayPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401007" : "5400004");
        tradeOrderCreateData.setCurrency("RMB");
        tradeOrderCreateData.setNeedLoginFlag("N");
        tradeOrderCreateData.setAccessMode("APP");
@@ -406,7 +406,7 @@
        
        
        TradeRequest request = new TradeRequest<TradeOrderCreateData>();
        request.setSceneId("1945688132719169536");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954793280550756352" : "1945688132719169536");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -458,7 +458,7 @@
        createOrderRequest.setChannelSource("GRJYCXWXXCX");
        
        TradeRequest request = new TradeRequest<CreateOrderRequest>();
        request.setSceneId("1948289607125864448");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954792737421942784" : "1948289607125864448");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(1);
        request.setRequestId(UUIDUtil.getRandomCode());
@@ -504,7 +504,7 @@
     * @return
     */
    public static PayInfo tradePayOff(TradePayOffData tradePayOffData) {
        tradePayOffData.setPartnerId("5400005");
        tradePayOffData.setPartnerId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "5401008" : "5400005");
        tradePayOffData.setTimeout("72H");
        tradePayOffData.setScene("TRAFFIC");
        tradePayOffData.setCurrency("RMB");
@@ -540,9 +540,9 @@
        
        
        TradeRequest request = new TradeRequest<TradePayOffData>();
        request.setSceneId("1774717104844095488");
        request.setSceneId("prod".equals(qianYunTongConfig.getActiveProfile()) ? "1954794605782913024" : "1774717104844095488");
        request.setAppId(qianYunTongConfig.getAppkey());
        request.setConfigVersion(2);
        request.setConfigVersion("prod".equals(qianYunTongConfig.getActiveProfile()) ? 1 : 2);
        request.setRequestId(UUIDUtil.getRandomCode());
        request.setData(tradePayOffData);
        //请求路径
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/QianYunTongConfig.java
@@ -186,7 +186,7 @@
        }
        if("prod".equals(activeProfile)){
            this.setAppkey("10001104");
            this.setPrivateKeyPath("/root/server/app/key/private_key.pem");
            this.setPrivateKeyPath("/etraffic/server/private_key.pem");
            this.setUserName("xiwang");
            this.setStatus("1");
            this.setApiUrl("http://jjzhongtai.stqcloud.com:10010");
UserQYTTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/qianyuntong/UserUtil.java
@@ -25,10 +25,7 @@
    private static QianYunTongConfig qianYunTongConfig = SpringContextsUtil.getBean(QianYunTongConfig.class).getQianYunTongConfig();
    
    
    public static void main(String[] args) {
//        List<QYTUserInfo> userInfoByPhone = getUserInfoByPhone("15828353127");
//        System.out.println(userInfoByPhone);
    }
    
    
    /**
@@ -321,4 +318,51 @@
        return object.getBoolean("isok");
    }
    
    /**
     * 根据手机号码获取易信uuid
     * @param mobile
     * @return
     */
    public static String getOnconUUIDByMobile(String mobile) {
        //请求路径
        String url = qianYunTongConfig.getApiUrl() + "/openapi/rest/1.0/getOnconUUIDByMobile";
        //私钥文件
        String skprivateKeyFile = qianYunTongConfig.getPrivateKeyPath();
        //注意:私钥文件需要开发者手动新建.pem文件,将委办局提供的私钥串复制进文件里用于sign加密
        String appKey = qianYunTongConfig.getAppkey();//appkey
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        Map<String, Object> contentMap = new HashMap<String, Object>();
        Date nowdate = new Date();
        SimpleDateFormat date = new SimpleDateFormat("yyyyMMddHHmmss");
        String timeStamp = date.format(nowdate);
        String messageId = UUID.randomUUID().toString().replaceAll("-", "");
        contentMap.put(SystemParameterNames.getAppKey(), appKey);
        contentMap.put(SystemParameterNames.getMessage_id(), messageId);
        contentMap.put(SystemParameterNames.getUserName(), qianYunTongConfig.getUserName());
        contentMap.put(SystemParameterNames.getStatus(), qianYunTongConfig.getStatus());
        Map<String, String> map = new HashMap<>();
        map.put("mobile", mobile);
        contentMap.put("content", JSON.toJSONString(map));
        log.info("【根据手机号码获取易信uuid】请求地址:" + url);
        log.info("【根据手机号码获取易信uuid】请求参数:" + JSON.toJSONString(contentMap));
        String result = OpenApiClient.sendCommonHttpRequst(url, headers, "POST", skprivateKeyFile, timeStamp, contentMap);
        log.info("【根据手机号码获取易信uuid】请求结果:" + result);
        JSONObject jsonObject = JSON.parseObject(result);
        String retCode = jsonObject.getString("retCode");
        if (!"0".equals(retCode)) {
            log.error("【根据手机号码获取易信uuid】请求失败:" + result);
            throw new RuntimeException("【根据手机号码获取易信uuid】请求失败:" + result);
        }
        JSONObject object = jsonObject.getJSONObject("object");
        Integer status = object.getInteger("status");
        if(0 != status){
            log.error("【身份证实名认证】请求失败:" + object.getString("desc"));
            throw new RuntimeException("【身份证实名认证】请求失败:" + object.getString("desc"));
        }
        return object.getString("onconUUID");
    }
}
UserQYTTravel/guns-admin/src/main/resources/application-dev.yml
@@ -15,7 +15,6 @@
    name: user-server
  profiles:
    active: dev
  #    active: prod
  mvc:
    static-path-pattern: /static/**
    view:
UserQYTTravel/guns-admin/src/main/resources/application-produce.yml
@@ -14,8 +14,7 @@
  application:
    name: user-server
  profiles:
    active: dev
  #    active: prod
    active: prod
  mvc:
    static-path-pattern: /static/**
    view:
@@ -30,18 +29,13 @@
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    host: 192.168.110.80
    port: 6379
    password: 123456
    host: 10.31.1.219
    port: 6410
    password: Qnz_jt@20#25
    database: 0
  #  redis:
  #    host: 172.21.35.151
  #    port: 6512
  #    password: SC_cache@20#25
  #    database: 0
  #    timeout: 1000
  #    cluster:
  #      nodes: 172.21.35.151:6512,172.21.35.152:6512,172.21.35.153:6512,172.21.35.151:6513,172.21.35.152:6513,172.21.35.153:6513
    timeout: 1000
    cluster:
      nodes: 10.31.1.219:6410,10.31.1.30:6410,10.31.1.97:6411
mybatis-plus:
  typeAliasesPackage: com.stylefeng.guns.modular
@@ -53,7 +47,7 @@
eureka:
  client:
    service-url: #注册中心地址
      defaultZone: http://sinata:sinata@192.168.110.85:8000/eureka #启用身份验证的方式连接
      defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
    register-with-eureka: true #在注册中心进行注册
    fetch-registry: true #从Eureka中获取注册信息。
@@ -66,29 +60,22 @@
spring:
  datasource:
    url: jdbc:mysql://192.168.110.80:3306/qyttravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    db-name: qyttravel #用来搜集数据库的所有表
    url: jdbc:mysql://10.31.9.146:8066/qnjt_ridingdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    username: qnjt_ridingusr
    password: qnjtriding@Prom2025
    db-name: traffic_scdb #用来搜集数据库的所有表
    filters: wall,mergeStat
  #spring:
  #  datasource:
  #    url: jdbc:mysql://172.21.35.140:8066/traffic_scdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
  #    username: traffic_scusr
  #    password: QYT_sc@20#25
  #    db-name: traffic_scdb #用来搜集数据库的所有表
  #    filters: wall,mergeStat
---
spring:
  data:
    mongodb:
      uri: mongodb://192.168.110.80:27017/traveling_track
  #      uri: mongodb://qyt_jtcx:qyt_jtcx2025@172.21.35.195:27017,172.21.35.196:27017/traveling_track
      host: 10.31.204.66
      port: 27009
      username: qnjt_ridingmgdb
      password: qnjtriding@Prom2025
      database: qnjt_ridingmgdb
---
@@ -117,12 +104,12 @@
  appKey: 111 #
qyt:
  socket_uri: http://192.168.110.85:6000
  socket_uri: http://10.31.182.13:6000
---
#支付回调地址
#正式环境
callbackPath: https://traffic.qytzt.cn/user
callbackPath: https://traffic.qytzt.cn/chuxing/user
---
@@ -133,10 +120,10 @@
#邮件配置
spring:
  mail:
    host: smtp.qq.com
    port: 465
    username: 1721849008@qq.com
    password: nhnbmjfdywilcbdj  # 这里是授权码,不是邮箱登录密码
    host: smtp.163.com
    port: 993
    username: QYTJT001@163.com
    password: GPaYdKdsQphDGRJd  # 这里是授权码,不是邮箱登录密码
    properties:
      mail:
        smtp:
@@ -146,4 +133,4 @@
# pdf生成位置
trip:
  sheet:
    filePath: D:/qytPdf/
    filePath: /etraffic/server/qytPdf/
UserQYTTravel/guns-admin/src/main/resources/application-test.yml
@@ -72,7 +72,7 @@
spring:
  data:
    mongodb:
      host: 10.88.204.206,10.88.204.207,10.88.204.208
      host: 10.88.204.206
      port: 27009
      username: qn_riding_adm
      password: QN_riding@Prom2025
@@ -106,7 +106,7 @@
  appKey: 111 #
qyt:
  socket_uri: http://192.168.110.85:6000
  socket_uri: http://10.88.188.199:6000
---
#支付回调地址
UserQYTTravel/guns-admin/src/test/java/com/stylefeng/guns/GunsApplicationTest.java
@@ -10,6 +10,7 @@
//import com.stylefeng.guns.modular.system.service.IDriverService;
//import com.stylefeng.guns.modular.system.service.IUserInfoService;
//import com.stylefeng.guns.modular.system.util.qianyuntong.OrderUtil;
//import com.stylefeng.guns.modular.system.util.qianyuntong.UserUtil;
//import com.stylefeng.guns.modular.system.util.qianyuntong.model.*;
//import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
//import lombok.extern.slf4j.Slf4j;
@@ -52,122 +53,7 @@
//
//    @Test
//    public void test(){
//        OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(228);
//        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
//        Company company = companyService.selectById(driver.getCompanyId());
//        UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
//        if(null == orderPrivateCar.getIsCreated()){
//            //先调中台创建订单
//            CreateOrderRequest createOrderRequest = new CreateOrderRequest();
//            createOrderRequest.setTreatShopId(driver.getEmpId().toString());
//            createOrderRequest.setField1("{\"profitSharing\":\"1\",\"isPromote\":\"" + (orderPrivateCar.getPromotion() == 2 ? 1 : 0) + "\"}");
//            createOrderRequest.setCharge(new BigDecimal(orderPrivateCar.getOrderMoney()));
//            createOrderRequest.setOrderNo("PR" + orderPrivateCar.getId());
//            createOrderRequest.setOrderId(orderPrivateCar.getTravelId());
//            createOrderRequest.setCustomerId(userInfo.getOnconUUID());
//            OrderInfo orderInfo = OrderUtil.tradeOrderCreate(createOrderRequest);
//            orderPrivateCar.setIsCreated(1);
//            orderPrivateCar.setTravelId(orderInfo.getOrderId());
//            orderPrivateCarService.updateById(orderPrivateCar);
//        }
//        //使用备付金进行支付订单
//        TradePayOffData tradePayOffData = new TradePayOffData();
//        tradePayOffData.setPartnerPayId(orderPrivateCar.getTravelId());
//        tradePayOffData.setTotalFee(Double.valueOf(orderPrivateCar.getOrderMoney() * 100).intValue() + "");
//        tradePayOffData.setOrderDesc("完成订单");
//        PayInfo payInfo = OrderUtil.tradePayOff(tradePayOffData);
//        String retCode = payInfo.getRetCode();
//        if (!"000000".equals(retCode)) {
//            log.error("备付金支付失败:{}", payInfo.getRetMsg());
//            return;
//        }
//        PayInfoData data = payInfo.getData();
//        String status = data.getStatus();
//        if ("3".equals(status)) {
//            log.error("备付金支付失败:{}", payInfo.getRetMsg());
//            return;
//        }
//        if("0".equals(status)){
//            //查询支付信息
//            GetPaymentInfoDataRequest getPaymentInfoDataRequest = new GetPaymentInfoDataRequest();
//            getPaymentInfoDataRequest.setPartnerPayId(orderPrivateCar.getTravelId());
//            GetPaymentInfo getPaymentInfo = OrderUtil.paymentInfo(getPaymentInfoDataRequest);
//            status = getPaymentInfo.getStatus();
//        }
//        PayInfoData payInfoData = payInfo.getData();
//        PaymentInfo paymentInfo = payInfoData.getPaymentInfos().get(0);
//        if(!"0".equals(status)){
//            //支付成功,通知三方
//            PaymentOrderRequest paymentOrderRequest = new PaymentOrderRequest();
//            paymentOrderRequest.setPayItemId(paymentInfo.getPayItemId());
//            paymentOrderRequest.setPaymentInfo(JSON.toJSONString(payInfoData.getPaymentInfos()));
//            paymentOrderRequest.setOrderId(orderPrivateCar.getTravelId());
//            paymentOrderRequest.setCharge(BigDecimal.valueOf(orderPrivateCar.getOrderMoney()));
//            paymentOrderRequest.setPayTime(data.getPayTime());
//            paymentOrderRequest.setPaymentSerialNumber(payInfoData.getPayId());
//            OrderInfo orderInfo1 = OrderUtil.paymentOrder(paymentOrderRequest);
//
//            //中台修改订单状态
//            ModifyTravelItineraryRequest request1 = new ModifyTravelItineraryRequest();
//            request1.setOrderId(orderPrivateCar.getTravelId());
//            request1.setStatus(9);
//            if (null != orderPrivateCar.getDriverId()) {
//                request1.setDriverId(driver.getEmpId().toString());
//                request1.setSupplierShopId(company.getEnterCode());
//            }
//            if (2 == orderPrivateCar.getPromotion()) {
//                Driver driver2 = driverService.selectById(orderPrivateCar.getPromotionDriverId());
//                request1.setPromoterId(driver2.getEmpId().toString());
//            }
//            OrderUtil.modifyTravelItinerary(request1);
//
//            String payId = payInfo.getData().getPayId();
//            //copy原始订单后生成追缴单
//            OrderPrivateCar orderPrivateCar1 = new OrderPrivateCar();
//            BeanUtils.copyProperties(orderPrivateCar, orderPrivateCar1);
//            orderPrivateCar1.setId(null);
//            orderPrivateCar1.setRecoveryOrder(1);
//
//            //修改原始订单为支付状态
//            orderPrivateCar.setState(8);
//            orderPrivateCar.setPayType(5);
//            orderPrivateCar.setPayMoney(orderPrivateCar.getOrderMoney());
//            orderPrivateCarService.updateById(orderPrivateCar);
//            //保存追缴单
//            orderPrivateCarService.insert(orderPrivateCar1);
//            //添加三方支付记录
//            try {
//                paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, 3, orderPrivateCar.getOrderMoney(), payId, 2);
//            } catch (Exception e) {
//                throw new RuntimeException(e);
//            }
//
//
//            Driver driver1 = driverService.selectById(orderPrivateCar1.getDriverId());
//            UserInfo userInfo1 = userInfoService.selectById(orderPrivateCar1.getUserId());
//            Company company1 = companyService.selectById(driver1.getCompanyId());
//            //调三方订单中心创建行程单
//            CreateTravelItineraryRequest request = new CreateTravelItineraryRequest();
//            request.setOrderNo("PR" + orderPrivateCar1.getId());
//            request.setCustomerId(userInfo1.getOnconUUID());
//            request.setDriverId(driver1.getEmpId().toString());
//            request.setSupplierShopId(company1.getEnterCode());
//            request.setServiceType(2);
//            String travelItinerary = OrderUtil.createTravelItinerary(request);
//            orderPrivateCar1.setTravelId(travelItinerary);
//            orderPrivateCar1.setIsCreated(0);
//            orderPrivateCarService.updateById(orderPrivateCar1);
//            //修改订单状态为待支付
//            ModifyTravelItineraryRequest modifyTravelItineraryRequest = new ModifyTravelItineraryRequest();
//            modifyTravelItineraryRequest.setOrderId(orderPrivateCar1.getTravelId());
//            modifyTravelItineraryRequest.setStatus(orderPrivateCar1.getState());
//            modifyTravelItineraryRequest.setDriverId(driver1.getEmpId().toString());
//            modifyTravelItineraryRequest.setSupplierShopId(company1.getEnterCode());
//            if (2 == orderPrivateCar1.getPromotion()) {
//                Driver driver2 = driverService.selectById(orderPrivateCar1.getPromotionDriverId());
//                modifyTravelItineraryRequest.setPromoterId(driver2.getEmpId().toString());
//            }
//            OrderUtil.modifyTravelItinerary(modifyTravelItineraryRequest);
//        }
//        String onconUUIDByMobile = UserUtil.getOnconUUIDByMobile("15828353127");
//        System.err.println(onconUUIDByMobile);
//    }
//}
UserQYTTravel/guns-admin/src/test/sql/test.sql
File was deleted
ZuulQYTTravel/pom.xml
@@ -66,7 +66,7 @@
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
@@ -75,5 +75,28 @@
            </plugin>
        </plugins>
    </build>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <spring.active>dev</spring.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <spring.active>test</spring.active>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <spring.active>prod</spring.active>
            </properties>
        </profile>
    </profiles>
</project>
ZuulQYTTravel/src/main/resources/application-dev.yml
New file
@@ -0,0 +1,41 @@
server:
    port: 5000
spring:
    profiles:
        active: dev
    application:
        name: zuul-gateway #服务名称
eureka:
    client:
        service-url: #注册中心地址
            defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
        register-with-eureka: true #在注册中心进行注册
        fetch-registry: true #从Eureka中获取注册信息。
zuul:
    #  prefix: /api #添加URL前缀
    sensitive-headers: #将默认过滤掉的敏感数据清除,不进行过滤("Cookie", "Set-Cookie", "Authorization")
    routes:
        user-server: #接口调用路由服务,名字任意取。(用户端服务)
            path: /user/** #配置请求URL的请求规则
            url: http://127.0.0.1:8006 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: user-server #指定Eureka注册中心的服务id
        driver-server: #路由司机相关请求
            path: /driver/** #配置请求URL的请求规则
            url: http://127.0.0.1:8007 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: driver-server #指定Eureka注册中心的服务id
        dispatch-server: #路由调度相关请求
            path: /dispatch/** #配置请求URL的请求规则
            url: http://127.0.0.1:8008 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: dispatch-server #指定Eureka注册中心的服务id
    #  配置zuul超时时间
    host:
        connect-timeout-millis: 150000
        socket-timeout-millis: 15000
# 配置ribbon超时时间
ribbon:
    ReadTimeout: 10000
    ConnectTimeout: 10000
ZuulQYTTravel/src/main/resources/application-prod.yml
New file
@@ -0,0 +1,41 @@
server:
  port: 5000
spring:
  profiles:
    active: prod
  application:
    name: zuul-gateway #服务名称
eureka:
  client:
    service-url: #注册中心地址
      defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
    register-with-eureka: true #在注册中心进行注册
    fetch-registry: true #从Eureka中获取注册信息。
zuul:
#  prefix: /api #添加URL前缀
  sensitive-headers: #将默认过滤掉的敏感数据清除,不进行过滤("Cookie", "Set-Cookie", "Authorization")
  routes:
    user-server: #接口调用路由服务,名字任意取。(用户端服务)
      path: /user/** #配置请求URL的请求规则
      url: http://127.0.0.1:8006 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: user-server #指定Eureka注册中心的服务id
    driver-server: #路由司机相关请求
      path: /driver/** #配置请求URL的请求规则
      url: http://127.0.0.1:8007 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: driver-server #指定Eureka注册中心的服务id
    dispatch-server: #路由调度相关请求
      path: /dispatch/** #配置请求URL的请求规则
      url: http://127.0.0.1:8008 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: dispatch-server #指定Eureka注册中心的服务id
  #  配置zuul超时时间
  host:
    connect-timeout-millis: 150000
    socket-timeout-millis: 15000
# 配置ribbon超时时间
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
ZuulQYTTravel/src/main/resources/application-test.yml
New file
@@ -0,0 +1,41 @@
server:
    port: 5000
spring:
    profiles:
        active: test
    application:
        name: zuul-gateway #服务名称
eureka:
    client:
        service-url: #注册中心地址
            defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
        register-with-eureka: true #在注册中心进行注册
        fetch-registry: true #从Eureka中获取注册信息。
zuul:
    #  prefix: /api #添加URL前缀
    sensitive-headers: #将默认过滤掉的敏感数据清除,不进行过滤("Cookie", "Set-Cookie", "Authorization")
    routes:
        user-server: #接口调用路由服务,名字任意取。(用户端服务)
            path: /user/** #配置请求URL的请求规则
            url: http://127.0.0.1:8006 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: user-server #指定Eureka注册中心的服务id
        driver-server: #路由司机相关请求
            path: /driver/** #配置请求URL的请求规则
            url: http://127.0.0.1:8007 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: driver-server #指定Eureka注册中心的服务id
        dispatch-server: #路由调度相关请求
            path: /dispatch/** #配置请求URL的请求规则
            url: http://127.0.0.1:8008 #真正的微服务地址,path匹配的请求都转发到这里
            serviceid: dispatch-server #指定Eureka注册中心的服务id
    #  配置zuul超时时间
    host:
        connect-timeout-millis: 150000
        socket-timeout-millis: 15000
# 配置ribbon超时时间
ribbon:
    ReadTimeout: 10000
    ConnectTimeout: 10000
ZuulQYTTravel/src/main/resources/application.yml
@@ -1,42 +1,3 @@
server:
  port: 5000
spring:
  profiles:
    active: dev
  #    active: prod
  application:
    name: zuul-gateway #服务名称
eureka:
  client:
    service-url: #注册中心地址
      defaultZone: http://sinata:sinata@127.0.0.1:8000/eureka #启用身份验证的方式连接
    register-with-eureka: true #在注册中心进行注册
    fetch-registry: true #从Eureka中获取注册信息。
zuul:
#  prefix: /api #添加URL前缀
  sensitive-headers: #将默认过滤掉的敏感数据清除,不进行过滤("Cookie", "Set-Cookie", "Authorization")
  routes:
    user-server: #接口调用路由服务,名字任意取。(用户端服务)
      path: /user/** #配置请求URL的请求规则
      url: http://127.0.0.1:8006 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: user-server #指定Eureka注册中心的服务id
    driver-server: #路由司机相关请求
      path: /driver/** #配置请求URL的请求规则
      url: http://127.0.0.1:8007 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: driver-server #指定Eureka注册中心的服务id
    dispatch-server: #路由调度相关请求
      path: /dispatch/** #配置请求URL的请求规则
      url: http://127.0.0.1:8008 #真正的微服务地址,path匹配的请求都转发到这里
      serviceid: dispatch-server #指定Eureka注册中心的服务id
  #  配置zuul超时时间
  host:
    connect-timeout-millis: 150000
    socket-timeout-millis: 15000
# 配置ribbon超时时间
ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000
    active: "@spring.active@"
ZuulQYTTravel/src/main/resources/logback.xml
New file
@@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,比如: 如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
    <property name="log.path" value="/etraffic/server/logs/zuul"/>
    <!--0. 日志格式和颜色渲染 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--1. 输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--2. 输出到文档-->
    <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/debug.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志归档 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录debug级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/info.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/warn.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录warn级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/error.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 2.5 所有 除了DEBUG级别的其它高于DEBUG的 日志,记录到一个文件  -->
    <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文档的路径及文档名 -->
        <file>${log.path}/all.log</file>
        <!--日志文档输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/all-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文档保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>
    <!--
        <logger>用来设置某一个包或者具体的某一个类的日志打印级别、
        以及指定<appender>。<logger>仅有一个name属性,
        一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
              如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
    -->
    <!--
        root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能设置为INHERITED或者同义词NULL。默认是DEBUG
        可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <!-- 4  最终的策略:
                 基本策略(root级) + 根据profile在启动时, logger标签中定制化package日志级别(优先级高于上面的root级)-->
    <springProfile name="dev">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
        <logger name="com.stylefeng.guns.modular.system.dao" level="debug"/>
    </springProfile>
    <springProfile name="test">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
    </springProfile>
    <springProfile name="prod">
        <root level="info">
            <!-- 生产环境最好不配置console写文件 -->
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="ALL_FILE" />
        </root>
    </springProfile>
</configuration>