From aed0e43ff4eb2cdb5fa81b6b9b16d8d2b723c02e Mon Sep 17 00:00:00 2001
From: liuyu <yu.liu@cqgbkj.com>
Date: 星期四, 17 九月 2026 10:57:49 +0800
Subject: [PATCH] feat: 新增 jnpf-tms 业务微服务骨架

---
 docker-compose.override.yml                                                       |    4 
 jnpf-tms/jnpf-tms-entity/pom.xml                                                  |   19 +
 dockerfile/tms/Dockerfile                                                         |   19 +
 start-all.ps1                                                                     |    5 
 jnpf-tms/jnpf-tms-api/src/main/java/jnpf/utils/TmsFeignName.java                  |   11 
 pom.xml                                                                           |    1 
 jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsService/package-info.java             |    4 
 docker-compose.testenv.yml                                                        |    1 
 config/host-override/discovery.yaml                                               |    2 
 config/shared/discovery.yaml                                                      |    2 
 jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsMapper/package-info.java              |    4 
 jnpf-tms/jnpf-tms-entity/src/main/java/jnpf/tmsEntity/package-info.java           |    4 
 jnpf-tms/jnpf-tms-server/src/main/resources/logback-spring.xml                    |  300 +++++++++++++++++++++++
 jnpf-tms/jnpf-tms-controller/pom.xml                                              |   26 ++
 stop-all.ps1                                                                      |    3 
 jnpf-tms/jnpf-tms-biz/pom.xml                                                     |   36 ++
 jnpf-tms/jnpf-tms-server/src/main/java/jnpf/JnpfTmsApplication.java               |   18 +
 start-all.sh                                                                      |    5 
 config/shared/router.yaml                                                         |    7 
 jnpf-tms/jnpf-tms-api/pom.xml                                                     |   25 +
 jnpf-tms/jnpf-tms-controller/src/main/java/jnpf/tmsController/PingController.java |   18 +
 README.md                                                                         |   22 
 jnpf-tms/jnpf-tms-server/src/main/resources/application.yml                       |   58 ++++
 config/shared/logger.yaml                                                         |    1 
 docker-compose.yml                                                                |    9 
 jnpf-tms/jnpf-tms-server/pom.xml                                                  |   97 +++++++
 jnpf-tms/pom.xml                                                                  |   21 +
 docker/delivery/assemble-offline-package.sh                                       |    1 
 28 files changed, 708 insertions(+), 15 deletions(-)

diff --git a/README.md b/README.md
index 1e3d8fa..ce0b5b9 100644
--- a/README.md
+++ b/README.md
@@ -138,15 +138,16 @@
 
 ### 鏈嶅姟鎷撴墤
 
-| 鏈嶅姟 | 绔彛 | 鑱岃矗 |
-|---|---|---|
-| `jnpf-gateway` | 30000 | API 缃戝叧锛岃矾鐢辫浆鍙戙�傚熀浜� WebFlux锛屼笌 servlet 鏍堜笉鑳藉悓杩涚▼锛屽繀椤荤嫭绔嬮儴缃� |
-| **`jnpf-platform`** | **30002** | **骞冲彴鑱氬悎鏈嶅姟**锛氫笅鍒椾節涓钩鍙版ā鍧楀悎骞跺湪涓�涓� JVM 鍐� |
-| `jnpf-scheduletask` | 30009 | 瀹氭椂浠诲姟锛坸xl-job admin锛夛紝鏈苟鍏� platform |
-| `jnpf-eln` | 30013 | ELN 鐢靛瓙瀹為獙璁板綍锛堝綋鍓嶄负楠ㄦ灦锛� |
-| `jnpf-biz-common` | 30015 | 鍏叡涓氬姟鑳藉姏鑱氬悎锛歄nlyOffice銆佸璁$瓑 |
-| `jnpf-dms` | 30016 | 鏂囨。绠$悊 |
-| **`jnpf-lims`** | **30019** | **LIMS 瀹為獙瀹や俊鎭鐞嗭紝涓昏涓氬姟妯″潡** |
+| 鏈嶅姟 | 绔彛 | 鑱岃矗                                                   |
+|---|---|------------------------------------------------------|
+| `jnpf-gateway` | 30000 | API 缃戝叧锛岃矾鐢辫浆鍙戙�傚熀浜� WebFlux锛屼笌 servlet 鏍堜笉鑳藉悓杩涚▼锛屽繀椤荤嫭绔嬮儴缃�       |
+| **`jnpf-platform`** | **30002** | **骞冲彴鑱氬悎鏈嶅姟**锛氫笅鍒椾節涓钩鍙版ā鍧楀悎骞跺湪涓�涓� JVM 鍐�                       |
+| `jnpf-scheduletask` | 30009 | 瀹氭椂浠诲姟锛坸xl-job admin锛夛紝鏈苟鍏� platform                     |
+| `jnpf-eln` | 30013 | ELN 鐢靛瓙瀹為獙璁板綍锛堝綋鍓嶄负楠ㄦ灦锛�                                    |
+| `jnpf-biz-common` | 30015 | 鍏叡涓氬姟鑳藉姏鑱氬悎锛歄nlyOffice銆佸璁$瓑                              |
+| `jnpf-dms` | 30016 | 鏂囨。绠$悊                                                 |
+| `jnpf-tms` | 30017 | TMS 鑰冭瘯鍩硅绠$悊                                 |
+| **`jnpf-lims`** | **30019** | **LIMS 瀹為獙瀹や俊鎭鐞嗭紝涓昏涓氬姟妯″潡**                              |
 | `jnpf-flow-engine` | 31000 | Flowable 7.0.1 娴佺▼寮曟搸銆�**鐙珛宸ョ▼锛屼笉鍦ㄦ牴 pom**锛岀敤鐙珛鏁版嵁搴� `jnpf_flow` |
 
 `jnpf-platform` 鍐呭惈鐨勪節涓ā鍧楋細
@@ -175,6 +176,7 @@
 |---|---|
 | `/api/lims/`銆乣/api/extend/`锛堟棫鍓嶇紑锛屽悓鎸囷級 | jnpf-lims |
 | `/api/dms/` | jnpf-dms |
+| `/api/tms/` | jnpf-tms |
 | `/api/eln/` | jnpf-eln |
 | `/api/biz/` | jnpf-biz-common锛堝 `/api/biz/onlyoffice/xxx`锛� |
 | `/api/audit/` | jnpf-biz-common锛堝埆鍚嶄繚鐣欙級 |
@@ -184,7 +186,7 @@
 
 ### 涓氬姟妯″潡鍒嗗眰
 
-浠� `jnpf-lims` 涓轰緥锛屽叾浠栦笟鍔℃ā鍧楋紙dms/eln锛夌粨鏋勭浉鍚岋細
+浠� `jnpf-lims` 涓轰緥锛屽叾浠栦笟鍔℃ā鍧楋紙dms/eln/tms锛夌粨鏋勭浉鍚岋細
 
 ```
 jnpf-lims/
diff --git a/config/host-override/discovery.yaml b/config/host-override/discovery.yaml
index 04da78e..7f24ed2 100644
--- a/config/host-override/discovery.yaml
+++ b/config/host-override/discovery.yaml
@@ -48,5 +48,7 @@
               - uri: http://127.0.0.1:30015
             jnpf-dms:
               - uri: http://127.0.0.1:30016
+            jnpf-tms:
+              - uri: http://127.0.0.1:30017
             jnpf-lims:
               - uri: http://127.0.0.1:30019
diff --git a/config/shared/discovery.yaml b/config/shared/discovery.yaml
index 25898f2..29ce05d 100644
--- a/config/shared/discovery.yaml
+++ b/config/shared/discovery.yaml
@@ -53,5 +53,7 @@
               - uri: http://cx-biz-common:30015
             jnpf-dms:
               - uri: http://cx-dms:30016
+            jnpf-tms:
+              - uri: http://cx-tms:30017
             jnpf-lims:
               - uri: http://cx-lims:30019
diff --git a/config/shared/logger.yaml b/config/shared/logger.yaml
index 84df7e3..fa89b0a 100644
--- a/config/shared/logger.yaml
+++ b/config/shared/logger.yaml
@@ -12,6 +12,7 @@
     # 鏂板鏈嶅姟鏃跺鏋滃畠鍦� log.level 閲屾病鏈� INFO 鏉$洰锛屽氨寰�杩欓噷琛ヤ竴琛屻��
     jnpf.JnpfGatewayApplication: INFO
     jnpf.JnpfLimsApplication: INFO
+    jnpf.JnpfTmsApplication: INFO
     # 瑙i櫎娉ㄩ噴鍚嶥ruid杩炴帴姹犳墦鍗癝QL璇彞
     druid.sql.Statement: debug
 #    druid.sql.DataSource: debug
diff --git a/config/shared/router.yaml b/config/shared/router.yaml
index 37f956a..ae7af95 100644
--- a/config/shared/router.yaml
+++ b/config/shared/router.yaml
@@ -63,6 +63,13 @@
             - Path=/api/dms/**
           filters:
             - StripPrefix=2
+        # TMS 涓氬姟鏈嶅姟
+        - id: jnpf-tms
+          uri: lb://jnpf-tms
+          predicates:
+            - Path=/api/tms/**
+          filters:
+            - StripPrefix=2
         # 鎶ヨ〃鏈嶅姟
         - id: jnpf-datareport
           uri: lb://jnpf-datareport
diff --git a/docker-compose.override.yml b/docker-compose.override.yml
index 790413e..375c8cb 100644
--- a/docker-compose.override.yml
+++ b/docker-compose.override.yml
@@ -125,6 +125,10 @@
     <<: *no-local-data-plane
     ports: ["127.0.0.1:30016:30016"]
     volumes: *config-shared-volume
+  cx-tms:
+    <<: *no-local-data-plane
+    ports: ["127.0.0.1:30017:30017"]
+    volumes: *config-shared-volume
   # cx-visualdata 闅忓钩鍙拌仛鍚堝仠鐢紝淇濈暀浠ヤ究鍥炴粴
   # cx-visualdata:
   #   <<: *no-local-data-plane
diff --git a/docker-compose.testenv.yml b/docker-compose.testenv.yml
index e02f392..bee4569 100644
--- a/docker-compose.testenv.yml
+++ b/docker-compose.testenv.yml
@@ -70,4 +70,5 @@
   cx-eln: *no-local-pg
   cx-biz-common: *no-local-pg
   cx-dms: *no-local-pg
+  cx-tms: *no-local-pg
   cx-scheduletask: *no-local-pg
diff --git a/docker-compose.yml b/docker-compose.yml
index a7e1481..058d4e0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -554,6 +554,15 @@
       <<: *hc-30000
       test: ["CMD-SHELL", "exec 3<>/dev/tcp/127.0.0.1/30016"]
 
+  cx-tms:
+    <<: *cx
+    container_name: cx-tms
+    image: cx/tms:${CX_VERSION:-1.0.0}
+    build: { context: ., dockerfile: dockerfile/tms/Dockerfile, args: { BASE_IMAGE: "${BASE_IMAGE:-bellsoft/liberica-openjre-rocky:21}" } }
+    healthcheck:
+      <<: *hc-30000
+      test: ["CMD-SHELL", "exec 3<>/dev/tcp/127.0.0.1/30017"]
+
   # 鈹�鈹� cx-visualdata 宸插苟鍏� cx-platform锛�2026-08-11锛夛紝鏁存娉ㄩ噴淇濈暀浠ヤ究鍥炴粴 鈹�鈹�
   # cx-visualdata:
   #   <<: *cx
diff --git a/docker/delivery/assemble-offline-package.sh b/docker/delivery/assemble-offline-package.sh
index b5cf240..4941d13 100644
--- a/docker/delivery/assemble-offline-package.sh
+++ b/docker/delivery/assemble-offline-package.sh
@@ -69,6 +69,7 @@
   jnpf-biz-common/jnpf-biz-common-server/target
   jnpf-lims/jnpf-lims-server/target
   jnpf-dms/jnpf-dms-server/target
+  jnpf-tms/jnpf-tms-server/target
 )
 for d in "${BIZ_JARS[@]}"; do
   ls "$d"/*.jar >/dev/null 2>&1 || die "缂轰笟鍔� jar锛�${d}/*.jar 鈥斺�� 鍏� make jars"
diff --git a/dockerfile/tms/Dockerfile b/dockerfile/tms/Dockerfile
new file mode 100644
index 0000000..a8aa772
--- /dev/null
+++ b/dockerfile/tms/Dockerfile
@@ -0,0 +1,19 @@
+# 鍩虹闀滃儚锛氭湰鍦伴粯璁� Docker Hub 澶氭灦鏋勶紙arm64 鍘熺敓锛孡024锛夛紱浜や粯鏋勫缓娉ㄥ叆 SWR amd64 鍗曟灦鏋�
+ARG BASE_IMAGE=bellsoft/liberica-openjre-rocky:21
+FROM ${BASE_IMAGE}
+LABEL maintainer=cx-team
+
+# 璁剧疆鏃跺尯
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+WORKDIR /data/jnpfsoft/javaApi/jnpf-tms
+
+COPY jnpf-tms/jnpf-tms-server/target/*.jar ./jnpf-tms.jar
+
+COPY config/shared /config/shared
+ENV JNPF_CONFIG_DIR=/config
+
+EXPOSE 30017
+
+ENTRYPOINT ["/bin/sh","-c","java --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED --add-opens=java.base/sun.net.util=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/jdk.internal.module=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar jnpf-tms.jar"]
diff --git a/jnpf-tms/jnpf-tms-api/pom.xml b/jnpf-tms/jnpf-tms-api/pom.xml
new file mode 100644
index 0000000..4f5f7a4
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-api/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-tms</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms-api</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-common-feign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-tms-entity</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/jnpf-tms/jnpf-tms-api/src/main/java/jnpf/utils/TmsFeignName.java b/jnpf-tms/jnpf-tms-api/src/main/java/jnpf/utils/TmsFeignName.java
new file mode 100644
index 0000000..0f2a70b
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-api/src/main/java/jnpf/utils/TmsFeignName.java
@@ -0,0 +1,11 @@
+package jnpf.utils;
+
+/**
+ * TMS 鏈嶅姟 Feign 鍚嶇О甯搁噺锛屼緵鍏跺畠鏈嶅姟寮曠敤銆�
+ */
+public class TmsFeignName {
+    public static final String TMS_SERVER_NAME = "jnpf-tms";
+
+    private TmsFeignName() {
+    }
+}
diff --git a/jnpf-tms/jnpf-tms-biz/pom.xml b/jnpf-tms/jnpf-tms-biz/pom.xml
new file mode 100644
index 0000000..0b7bb2e
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-biz/pom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-tms</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-cloud-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-common-database</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-tms-entity</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-tms-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsMapper/package-info.java b/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsMapper/package-info.java
new file mode 100644
index 0000000..21c3fed
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsMapper/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * TMS MyBatis Mapper 鍖咃紙鐢� {@code @MapperScan("jnpf.tmsMapper")} 鎵弿锛夈��
+ */
+package jnpf.tmsMapper;
diff --git a/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsService/package-info.java b/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsService/package-info.java
new file mode 100644
index 0000000..c23e640
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-biz/src/main/java/jnpf/tmsService/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * TMS 涓氬姟鏈嶅姟鍖呫��
+ */
+package jnpf.tmsService;
diff --git a/jnpf-tms/jnpf-tms-controller/pom.xml b/jnpf-tms/jnpf-tms-controller/pom.xml
new file mode 100644
index 0000000..322bd0b
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-controller/pom.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-tms</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms-controller</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-common-springaop</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-tms-biz</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/jnpf-tms/jnpf-tms-controller/src/main/java/jnpf/tmsController/PingController.java b/jnpf-tms/jnpf-tms-controller/src/main/java/jnpf/tmsController/PingController.java
new file mode 100644
index 0000000..3c88351
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-controller/src/main/java/jnpf/tmsController/PingController.java
@@ -0,0 +1,18 @@
+package jnpf.tmsController;
+
+import jnpf.base.ActionResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 閾捐矾楠屾敹鎺㈤拡锛氱綉鍏� /api/tms/ping锛圫tripPrefix=2锛夆啋 鏈湇鍔� /ping銆�
+ * 鏀捐閰嶇疆瑙� application.yml锛坰a-token / 绉熸埛 / 鍐呴儴閴存潈涓夊锛夈��
+ */
+@RestController
+public class PingController {
+
+    @GetMapping("/ping")
+    public ActionResult<String> ping() {
+        return ActionResult.success("pong");
+    }
+}
diff --git a/jnpf-tms/jnpf-tms-entity/pom.xml b/jnpf-tms/jnpf-tms-entity/pom.xml
new file mode 100644
index 0000000..5b09dd9
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-entity/pom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-tms</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms-entity</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-common-core</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/jnpf-tms/jnpf-tms-entity/src/main/java/jnpf/tmsEntity/package-info.java b/jnpf-tms/jnpf-tms-entity/src/main/java/jnpf/tmsEntity/package-info.java
new file mode 100644
index 0000000..e802afe
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-entity/src/main/java/jnpf/tmsEntity/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * TMS 瀹炰綋 / DTO / VO 鍖呫��
+ */
+package jnpf.tmsEntity;
diff --git a/jnpf-tms/jnpf-tms-server/pom.xml b/jnpf-tms/jnpf-tms-server/pom.xml
new file mode 100644
index 0000000..aeba1dc
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-server/pom.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-tms</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms-server</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jnpf</groupId>
+            <artifactId>jnpf-tms-controller</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>default-package</id>
+            <activation>
+                <jdk>[,]</jdk>
+            </activation>
+            <build>
+                <finalName>jnpf-tms-${project.version}</finalName>
+                <plugins>
+                    <plugin>
+                        <groupId>org.springframework.boot</groupId>
+                        <artifactId>spring-boot-maven-plugin</artifactId>
+                        <configuration>
+                            <mainClass>jnpf.JnpfTmsApplication</mainClass>
+                            <layout>ZIP</layout>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>repackage</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>external-package</id>
+            <build>
+                <finalName>jnpf-tms-${project.version}</finalName>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>copy-dependencies</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>copy-dependencies</goal>
+                                </goals>
+                                <configuration>
+                                    <outputDirectory>${external-lib-out-path}</outputDirectory>
+                                    <overWriteReleases>true</overWriteReleases>
+                                    <overWriteSnapshots>true</overWriteSnapshots>
+                                    <overWriteIfNewer>true</overWriteIfNewer>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-jar-plugin</artifactId>
+                        <configuration>
+                            <archive>
+                                <manifest>
+                                    <mainClass>jnpf.JnpfTmsApplication</mainClass>
+                                    <addClasspath>true</addClasspath>
+                                    <classpathPrefix>${external-lib-start-path}</classpathPrefix>
+                                </manifest>
+                                <manifestEntries>
+                                    <Class-Path>.</Class-Path>
+                                </manifestEntries>
+                            </archive>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
diff --git a/jnpf-tms/jnpf-tms-server/src/main/java/jnpf/JnpfTmsApplication.java b/jnpf-tms/jnpf-tms-server/src/main/java/jnpf/JnpfTmsApplication.java
new file mode 100644
index 0000000..a7dacc9
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-server/src/main/java/jnpf/JnpfTmsApplication.java
@@ -0,0 +1,18 @@
+package jnpf;
+
+import lombok.extern.slf4j.Slf4j;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@Slf4j
+@SpringBootApplication
+@EnableFeignClients
+@MapperScan(value = "jnpf.tmsMapper")
+public class JnpfTmsApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(JnpfTmsApplication.class, args);
+        JnpfTmsApplication.log.info("TMS鍚姩鎴愬姛");
+    }
+}
diff --git a/jnpf-tms/jnpf-tms-server/src/main/resources/application.yml b/jnpf-tms/jnpf-tms-server/src/main/resources/application.yml
new file mode 100644
index 0000000..5c14594
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-server/src/main/resources/application.yml
@@ -0,0 +1,58 @@
+spring:
+  application:
+    name: jnpf-tms
+  mvc:
+    servlet:
+      load-on-startup: 0
+  main:
+    allow-bean-definition-overriding: true
+    allow-circular-references: true
+  config:
+    # 閰嶇疆鏉ユ簮 = 浠撳簱 config/锛堥暅鍍忓唴 /config锛岀粡 JNPF_CONFIG_DIR 鎸囧悜锛夈��
+    import:
+      - file:${JNPF_CONFIG_DIR:config}/shared/datasource.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/resources.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/system-config.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/frame-config.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/logger.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/mq.yaml
+      - file:${JNPF_CONFIG_DIR:config}/shared/discovery.yaml
+      - optional:file:${JNPF_CONFIG_DIR:config}/host-override/discovery.yaml
+
+# 搴旂敤鏈嶅姟鍣�
+server:
+  tomcat:
+    uri-encoding: UTF-8
+  port: 30017
+
+management:
+  endpoints:
+    web:
+      exposure:
+        include: '*'
+  endpoint:
+    health:
+      show-details: always
+    logfile:
+      access: unrestricted
+
+# ping 鎺㈤拡鏀捐
+jnpf:
+  security:
+    ignore:
+      urls:
+        - /ping
+        - /api/tms/ping
+        - /dev-api/tms/ping
+  tenant:
+    ignore-urls:
+      - /ping
+      - /api/tms/ping
+      - /dev-api/tms/ping
+
+sa-token:
+  filter:
+    exclude-paths:
+      - /ping
+      - /api/tms/ping
+      - /dev-api/tms/ping
diff --git a/jnpf-tms/jnpf-tms-server/src/main/resources/logback-spring.xml b/jnpf-tms/jnpf-tms-server/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..7b26ba3
--- /dev/null
+++ b/jnpf-tms/jnpf-tms-server/src/main/resources/logback-spring.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <!--鏃ュ織鏍煎紡搴旂敤spring boot榛樿鐨勬牸寮忥紝涔熷彲浠ヨ嚜宸辨洿鏀�-->
+    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
+    <property name="FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n" />
+    <springProperty scope="context" name="SERVICE_NAME" source="spring.application.name" defaultValue="jnpf"/>
+
+    <!--瀹氫箟鏃ュ織瀛樻斁鐨勪綅缃紝榛樿瀛樻斁鍦ㄩ」鐩惎鍔ㄧ殑鐩稿璺緞鐨勭洰褰�-->
+    <springProperty scope="context" name="LOG_PATH" source="log.path" defaultValue="log/${SERVICE_NAME}"/>
+    <!-- 鍏ㄥ眬鏃ュ織绛夌骇 -->
+    <springProperty scope="context" name="LOG_LEVEL_ROOT" source="log.level.root" defaultValue="INFO"/>
+    <!-- 鏈嶅姟鑷畾涔夌瓑绾� 濡傞渶鑷畾涔夋湇鍔℃棩蹇楃瓑绾� 淇敼涓嬫柟鐨勩�愯嚜瀹氫箟鏈嶅姟鍚嶃�戜笌nacos涓婄殑log.level.鑷畾涔夋湇鍔″悕=绛夌骇 -->
+    <springProperty scope="context" name="LOG_LEVEL" source="log.level.jnpf-tms" defaultValue="${LOG_LEVEL_ROOT}"/>
+
+    <!-- 鏃ュ織璁板綍鍣紝鏃ユ湡婊氬姩璁板綍锛宭evel涓� ERROR 鏃ュ織 -->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃浠剁殑璺緞鍙婃枃浠跺悕 -->
+        <file>${LOG_PATH}/log_error.log</file>
+
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
+            <!-- 褰掓。鐨勬棩蹇楁枃浠剁殑璺緞锛�%d{yyyy-MM-dd}鎸囧畾鏃ユ湡鏍煎紡锛�%i鎸囧畾绱㈠紩 -->
+            <fileNamePattern>${LOG_PATH}/error/%d{yyyy-MM-dd,aux}/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶7澶�-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 闄ゆ寜鏃ュ織璁板綍涔嬪锛岃繕閰嶇疆浜嗘棩蹇楁枃浠朵笉鑳借秴杩�2M锛岃嫢瓒呰繃2M锛屾棩蹇楁枃浠朵細浠ョ储寮�0寮�濮嬶紝
+            鍛藉悕鏃ュ織鏂囦欢锛屼緥濡俵og-error-2013-12-21.0.log -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 杩藉姞鏂瑰紡璁板綍鏃ュ織 -->
+        <append>true</append>
+
+        <!-- 鏃ュ織鏂囦欢鐨勬牸寮� -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 姝ゆ棩蹇楁枃浠跺彧璁板綍error绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 鏃ュ織璁板綍鍣紝鏃ユ湡婊氬姩璁板綍锛宭evel涓� INFO 鏃ュ織 -->
+    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃浠剁殑璺緞鍙婃枃浠跺悕 -->
+        <file>${LOG_PATH}/log_info.log</file>
+
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
+            <!-- 褰掓。鐨勬棩蹇楁枃浠剁殑璺緞锛�%d{yyyy-MM-dd}鎸囧畾鏃ユ湡鏍煎紡锛�%i鎸囧畾绱㈠紩 -->
+            <fileNamePattern>${LOG_PATH}/info/%d{yyyy-MM-dd,aux}/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶7澶�-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 闄ゆ寜鏃ュ織璁板綍涔嬪锛岃繕閰嶇疆浜嗘棩蹇楁枃浠朵笉鑳借秴杩�2M锛岃嫢瓒呰繃2M锛屾棩蹇楁枃浠朵細浠ョ储寮�0寮�濮嬶紝
+            鍛藉悕鏃ュ織鏂囦欢锛屼緥濡俵og-error-2013-12-21.0.log -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 杩藉姞鏂瑰紡璁板綍鏃ュ織 -->
+        <append>true</append>
+
+        <!-- 鏃ュ織鏂囦欢鐨勬牸寮� -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 姝ゆ棩蹇楁枃浠跺彧璁板綍info绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 鏃ュ織璁板綍鍣紝鏃ユ湡婊氬姩璁板綍锛宭evel涓� WARN 鏃ュ織 -->
+    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃浠剁殑璺緞鍙婃枃浠跺悕 -->
+        <file>${LOG_PATH}/log_warn.log</file>
+
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
+            <!-- 褰掓。鐨勬棩蹇楁枃浠剁殑璺緞锛�%d{yyyy-MM-dd}鎸囧畾鏃ユ湡鏍煎紡锛�%i鎸囧畾绱㈠紩 -->
+            <fileNamePattern>${LOG_PATH}/warn/%d{yyyy-MM-dd,aux}/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶7澶�-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 闄ゆ寜鏃ュ織璁板綍涔嬪锛岃繕閰嶇疆浜嗘棩蹇楁枃浠朵笉鑳借秴杩�2M锛岃嫢瓒呰繃2M锛屾棩蹇楁枃浠朵細浠ョ储寮�0寮�濮嬶紝
+            鍛藉悕鏃ュ織鏂囦欢锛屼緥濡俵og-error-2013-12-21.0.log -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 杩藉姞鏂瑰紡璁板綍鏃ュ織 -->
+        <append>true</append>
+
+        <!-- 鏃ュ織鏂囦欢鐨勬牸寮� -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 姝ゆ棩蹇楁枃浠跺彧璁板綍warn绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 鏃ュ織璁板綍鍣紝鏃ユ湡婊氬姩璁板綍锛宭evel涓� DEBUG 鏃ュ織 -->
+    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃浠剁殑璺緞鍙婃枃浠跺悕 -->
+        <file>${LOG_PATH}/log_debug.log</file>
+
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
+            <!-- 褰掓。鐨勬棩蹇楁枃浠剁殑璺緞锛�%d{yyyy-MM-dd}鎸囧畾鏃ユ湡鏍煎紡锛�%i鎸囧畾绱㈠紩 -->
+            <fileNamePattern>${LOG_PATH}/debug/%d{yyyy-MM-dd,aux}/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶7澶�-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 闄ゆ寜鏃ュ織璁板綍涔嬪锛岃繕閰嶇疆浜嗘棩蹇楁枃浠朵笉鑳借秴杩�2M锛岃嫢瓒呰繃2M锛屾棩蹇楁枃浠朵細浠ョ储寮�0寮�濮嬶紝
+            鍛藉悕鏃ュ織鏂囦欢锛屼緥濡俵og-error-2013-12-21.0.log -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 杩藉姞鏂瑰紡璁板綍鏃ュ織 -->
+        <append>true</append>
+
+        <!-- 鏃ュ織鏂囦欢鐨勬牸寮� -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+
+        <!-- 姝ゆ棩蹇楁枃浠跺彧璁板綍debug绾у埆鐨� -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 鏃ュ織璁板綍鍣紝鏃ユ湡婊氬姩璁板綍锛屾墍鏈夋棩蹇� -->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+
+        <!-- 姝e湪璁板綍鐨勬棩蹇楁枃浠剁殑璺緞鍙婃枃浠跺悕 -->
+        <file>${LOG_PATH}/log_total.log</file>
+
+        <!-- 鏃ュ織璁板綍鍣ㄧ殑婊氬姩绛栫暐锛屾寜鏃ユ湡锛屾寜澶у皬璁板綍 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+
+            <!-- 褰掓。鐨勬棩蹇楁枃浠剁殑璺緞锛�%d{yyyy-MM-dd}鎸囧畾鏃ユ湡鏍煎紡锛�%i鎸囧畾绱㈠紩 -->
+            <fileNamePattern>${LOG_PATH}/total/%d{yyyy-MM-dd,aux}/log-total-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
+            <!--鏃ュ織鏈�澶х殑鍘嗗彶7澶�-->
+            <maxHistory>7</maxHistory>
+
+            <!-- 闄ゆ寜鏃ュ織璁板綍涔嬪锛岃繕閰嶇疆浜嗘棩蹇楁枃浠朵笉鑳借秴杩�2M锛岃嫢瓒呰繃2M锛屾棩蹇楁枃浠朵細浠ョ储寮�0寮�濮嬶紝
+            鍛藉悕鏃ュ織鏂囦欢锛屼緥濡俵og-error-2013-12-21.0.log -->
+            <maxFileSize>10MB</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 杩藉姞鏂瑰紡璁板綍鏃ュ織 -->
+        <append>true</append>
+
+        <!-- 鏃ュ織鏂囦欢鐨勬牸寮� -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>${FILE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 寮傛杈撳嚭 DEBUG -->
+    <appender name="ASYNC_FILE_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_DEBUG"/>
+    </appender>
+    <!-- 寮傛杈撳嚭 INFO -->
+    <appender name="ASYNC_FILE_INFO" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_INFO"/>
+    </appender>
+    <!-- 寮傛杈撳嚭 WARN -->
+    <appender name="ASYNC_FILE_WARN" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_WARN"/>
+    </appender>
+    <!-- 寮傛杈撳嚭 ERROR -->
+    <appender name="ASYNC_FILE_ERROR" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ERROR"/>
+    </appender>
+    <!-- 寮傛杈撳嚭 ALL -->
+    <appender name="ASYNC_FILE_ALL" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="FILE_ALL"/>
+    </appender>
+
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+
+    <!-- 寮傛杈撳嚭 鎺у埗鍙� -->
+    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
+        <discardingThreshold>0</discardingThreshold>
+        <queueSize>256</queueSize>
+        <appender-ref ref="STDOUT"/>
+    </appender>
+
+
+    <!--<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        &lt;!&ndash; 蹇呭~锛氱洰鏍囷細LogStash鐨� IP:Port &ndash;&gt;
+        <destination>192.168.0.50:50000</destination>
+        &lt;!&ndash; 鍙�夛細淇濇寔绋嬪簭瀛樻椿鏃堕棿 &ndash;&gt;
+        <keepAliveDuration>5 minutes</keepAliveDuration>
+        &lt;!&ndash; 鍙�夛細閲嶈繛寤惰繜鏃堕暱 &ndash;&gt;
+        <reconnectionDelay>10 second</reconnectionDelay>
+        &lt;!&ndash; 鍙�夛細绛夊緟绛栫暐 &ndash;&gt;
+        <waitStrategyType>sleeping</waitStrategyType>
+        &lt;!&ndash;  ============ encoder蹇呴』閰嶇疆,鏈夊绉嶅彲閫� ============= &ndash;&gt;
+        &lt;!&ndash; 缂栫爜鍣ㄤ簩锛歀oggingEventCompositeJsonEncoder &ndash;&gt;
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                &lt;!&ndash; 鏃堕棿鎴筹細鏃跺尯 &ndash;&gt;
+                <timestamp>
+                    <timeZone>UTC</timeZone>
+                </timestamp>
+                &lt;!&ndash; 妯″紡 &ndash;&gt;
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${SERVICE_NAME:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "msg": "%message"
+                        &lt;!&ndash;"idx_pre": "elk-original-third-access",&ndash;&gt;
+                        &lt;!&ndash;"json": "#asJson{%message}"  杩欎釜asJson鍙互鎶婂搴旂殑瀛楃涓蹭綔涓簀son瀵硅薄鍙栧嚭鏉ワ紝杩欐牱es鍙互瀵筳son閲岄潰鐨勫瓧娈电储寮曚簡&ndash;&gt;
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>-->
+    <!--<appender name="skywalking-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
+                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
+            </layout>
+        </encoder>
+    </appender>-->
+
+
+    <root level="${LOG_LEVEL}">
+        <appender-ref ref="ASYNC_STDOUT"/>
+        <appender-ref ref="ASYNC_FILE_ERROR"/>
+        <appender-ref ref="ASYNC_FILE_INFO"/>
+        <appender-ref ref="ASYNC_FILE_WARN"/>
+        <appender-ref ref="ASYNC_FILE_DEBUG"/>
+        <appender-ref ref="ASYNC_FILE_ALL"/>
+        <!--<appender-ref ref="LOGSTASH"/>-->
+        <!--<appender-ref ref="skywalking-log"/>-->
+    </root>
+
+
+</configuration>
diff --git a/jnpf-tms/pom.xml b/jnpf-tms/pom.xml
new file mode 100644
index 0000000..e20745b
--- /dev/null
+++ b/jnpf-tms/pom.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>jnpf-java-cloud</artifactId>
+        <groupId>com.jnpf</groupId>
+        <version>6.1.0-RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>jnpf-tms</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>jnpf-tms-api</module>
+        <module>jnpf-tms-entity</module>
+        <module>jnpf-tms-biz</module>
+        <module>jnpf-tms-controller</module>
+        <module>jnpf-tms-server</module>
+    </modules>
+</project>
diff --git a/pom.xml b/pom.xml
index e06fd91..cd8e1b0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,6 +27,7 @@
         <module>jnpf-lims</module>
         <module>jnpf-dms</module>
         <module>jnpf-eln</module>
+        <module>jnpf-tms</module>
         <!-- jnpf-audit 宸蹭簬 2026-08-11 鏁翠綋鎼叆 jnpf-biz-common锛�6 妯″潡鍘嬪埌 3 涓紝
              jnpf-audit-server / cx-audit 閫�褰癸級锛屼笉鍐嶆槸椤跺眰妯″潡 -->
         <module>jnpf-biz-common</module>
diff --git a/start-all.ps1 b/start-all.ps1
index 048e6f9..e67b948 100644
--- a/start-all.ps1
+++ b/start-all.ps1
@@ -57,6 +57,7 @@
     [PSCustomObject]@{ Name = 'jnpf-eln';        Jar = "jnpf-eln/jnpf-eln-server/target/jnpf-eln-$($Script:Version).jar";                        Port = 30013 }
     [PSCustomObject]@{ Name = 'jnpf-lims';       Jar = "jnpf-lims/jnpf-lims-server/target/jnpf-lims-$($Script:Version).jar";                   Port = 30019 }
     [PSCustomObject]@{ Name = 'jnpf-dms';        Jar = "jnpf-dms/jnpf-dms-server/target/jnpf-dms-$($Script:Version).jar";                       Port = 30016 }
+    [PSCustomObject]@{ Name = 'jnpf-tms';        Jar = "jnpf-tms/jnpf-tms-server/target/jnpf-tms-$($Script:Version).jar";                       Port = 30017 }
 )
 
 $Script:TargetServices = @()
@@ -778,7 +779,7 @@
     switch ($Name) {
         'jnpf-platform'   { return 1 }
         'jnpf-biz-common' { return 2 }
-        { $_ -in 'jnpf-lims', 'jnpf-dms' } { return 3 }
+        { $_ -in 'jnpf-lims', 'jnpf-dms', 'jnpf-tms' } { return 3 }
         default           { return 4 }
     }
 }
@@ -883,7 +884,7 @@
   --build, -b    鍚姩鍓嶅厛缂栬瘧椤圭洰
 
 鏈嶅姟鍚嶏紙鍙�夛紝鐪佺暐 = 鍏ㄩ儴锛�:
-  jnpf-gateway  jnpf-platform  jnpf-biz-common  jnpf-eln  jnpf-lims  jnpf-dms
+  jnpf-gateway  jnpf-platform  jnpf-biz-common  jnpf-eln  jnpf-lims  jnpf-dms  jnpf-tms
 
   娉細jnpf-biz-common(30015) 鍚璁¤兘鍔涖��
       鍙捣 jnpf-lims 鑰屼笉璧峰畠锛屽璁′簨浠朵細鎶曢�掑け璐ュ苟钀� spool銆�
diff --git a/start-all.sh b/start-all.sh
index d4d7432..dfb309e 100644
--- a/start-all.sh
+++ b/start-all.sh
@@ -153,6 +153,7 @@
   "jnpf-eln         jnpf-eln/jnpf-eln-server/target/jnpf-eln-${VERSION}.jar                    30013"
   "jnpf-lims        jnpf-lims/jnpf-lims-server/target/jnpf-lims-${VERSION}.jar               30019"
   "jnpf-dms         jnpf-dms/jnpf-dms-server/target/jnpf-dms-${VERSION}.jar                   30016"
+  "jnpf-tms         jnpf-tms/jnpf-tms-server/target/jnpf-tms-${VERSION}.jar                   30017"
 )
 
 # 琛ヤ竵 #8锛氬涓绘爤鐩磋繛鍧愭爣锛堣鐩� config/shared 閲岀殑 compose 榛樿鍊硷級
@@ -497,7 +498,7 @@
   --build, -b    鍚姩鍓嶅厛缂栬瘧椤圭洰
 
 鏈嶅姟鍚嶏紙鍙�夛紝鐪佺暐 = 鍏ㄩ儴锛�:
-  jnpf-gateway  jnpf-platform  jnpf-biz-common  jnpf-lims  jnpf-dms
+  jnpf-gateway  jnpf-platform  jnpf-biz-common  jnpf-lims  jnpf-dms  jnpf-tms
 
   娉細jnpf-biz-common(30015) 鍚璁¤兘鍔涳紙2026-08-11 鐢卞師 jnpf-audit:30014 鎼叆锛夈��
       鍙捣 jnpf-lims 鑰屼笉璧峰畠锛屽璁′簨浠朵細鎶曢�掑け璐ュ苟钀� spool銆�
@@ -629,7 +630,7 @@
   case "$1" in
     jnpf-platform)    echo 1 ;;
     jnpf-biz-common)  echo 2 ;;
-    jnpf-lims|jnpf-dms) echo 3 ;;
+    jnpf-lims|jnpf-dms|jnpf-tms) echo 3 ;;
     *)                echo 4 ;;
   esac
 }
diff --git a/stop-all.ps1 b/stop-all.ps1
index 86c96bd..c5d496a 100644
--- a/stop-all.ps1
+++ b/stop-all.ps1
@@ -37,6 +37,7 @@
     [PSCustomObject]@{ Name = 'jnpf-eln';        Jar = 'jnpf-eln-6.1.0-RELEASE.jar';        Port = 30013 }
     [PSCustomObject]@{ Name = 'jnpf-lims';       Jar = 'jnpf-lims-6.1.0-RELEASE.jar';       Port = 30019 }
     [PSCustomObject]@{ Name = 'jnpf-dms';        Jar = 'jnpf-dms-6.1.0-RELEASE.jar';        Port = 30016 }
+    [PSCustomObject]@{ Name = 'jnpf-tms';        Jar = 'jnpf-tms-6.1.0-RELEASE.jar';        Port = 30017 }
 )
 
 function Write-ColorLine {
@@ -72,7 +73,7 @@
     Write-Host ''
     Write-Host '鐪佺暐鏈嶅姟鍚嶆椂鍋滄鍏ㄩ儴鏈嶅姟锛涙寚瀹氭湇鍔″悕鏃跺彧鍋滄瀵瑰簲鏈嶅姟锛�'
     Write-Host '  jnpf-gateway  jnpf-platform  jnpf-biz-common'
-    Write-Host '  jnpf-eln      jnpf-lims      jnpf-dms'
+    Write-Host '  jnpf-eln      jnpf-lims      jnpf-dms      jnpf-tms'
     Write-Host ''
     Write-Host '绀轰緥:'
     Write-Host "  .\$scriptName"

--
Gitblit v1.8.0