ソースを参照

初始化导入,测试通过

qdy 3ヶ月前
コミット
36d78f302d
6個のファイルの変更809行の追加0行の削除
  1. 82
    0
      gct.sh
  2. 60
    0
      go.mod
  3. 145
    0
      go.sum
  4. 154
    0
      main.go
  5. 186
    0
      service/agentToDoris.go
  6. 182
    0
      test/my_agent_to_doris_test.go

+ 82
- 0
gct.sh ファイルの表示

@@ -0,0 +1,82 @@
1
+#!/bin/bash
2
+
3
+# 脚本用法:./git-commit-and-tag.sh "你的提交描述" "版本号"
4
+
5
+# 检查参数数量
6
+if [ $# -ne 2 ]; then
7
+    echo "错误: 脚本需要2个参数。"
8
+    echo "用法: $0 \"提交描述\" \"版本号\""
9
+    echo "示例: $0 \"修复了登录问题\" \"v1.2.3\""
10
+    exit 1
11
+fi
12
+
13
+# 分配参数
14
+COMMIT_MESSAGE="$1"
15
+VERSION_TAG="$2"
16
+
17
+# 检查当前目录是否为Git仓库
18
+if ! git rev-parse --git-dir > /dev/null 2>&1; then
19
+    echo "错误: 当前目录不是一个Git仓库。"
20
+    exit 1
21
+fi
22
+
23
+echo "开始处理提交和版本标签..."
24
+echo "提交描述: $COMMIT_MESSAGE"
25
+echo "版本标签: $VERSION_TAG"
26
+
27
+# 检查是否有未提交的更改
28
+if [ -n "$(git status --porcelain)" ]; then
29
+    echo "检测到未提交的更改,正在提交..."
30
+    
31
+    # 添加所有更改到暂存区
32
+    git add .
33
+    
34
+    # 进行提交
35
+    git commit -m "$COMMIT_MESSAGE"
36
+    if [ $? -ne 0 ]; then
37
+        echo "错误: 提交失败。"
38
+        exit 1
39
+    fi
40
+    echo "✅ 更改已提交"
41
+else
42
+    echo "提示: 没有未提交的更改,跳过提交步骤"
43
+    
44
+    # 检查是否有未提交的commit但未推送
45
+    LOCAL_COMMITS=$(git log @{u}..HEAD --oneline 2>/dev/null | wc -l)
46
+    if [ $LOCAL_COMMITS -eq 0 ]; then
47
+        echo "错误: 没有需要推送的提交。"
48
+        exit 1
49
+    else
50
+        echo "检测到 $LOCAL_COMMITS 个本地提交等待推送"
51
+    fi
52
+fi
53
+
54
+# 检查标签是否已存在
55
+if git rev-parse "$VERSION_TAG" >/dev/null 2>&1; then
56
+    echo "错误: 标签 '$VERSION_TAG' 已经存在。"
57
+    exit 1
58
+fi
59
+
60
+# 创建标签
61
+git tag "$VERSION_TAG"
62
+if [ $? -ne 0 ]; then
63
+    echo "错误: 创建标签失败。"
64
+    exit 1
65
+fi
66
+echo "✅ 标签 '$VERSION_TAG' 已创建"
67
+
68
+# 推送到远程仓库并推送标签
69
+echo "正在推送到远程仓库..."
70
+git push
71
+if [ $? -ne 0 ]; then
72
+    echo "错误: 推送提交失败。"
73
+    exit 1
74
+fi
75
+
76
+git push origin "$VERSION_TAG"
77
+if [ $? -ne 0 ]; then
78
+    echo "错误: 推送标签失败。"
79
+    exit 1
80
+fi
81
+
82
+echo "✅ 完成!提交已推送,版本标签 $VERSION_TAG 已创建并推送。"

+ 60
- 0
go.mod ファイルの表示

@@ -0,0 +1,60 @@
1
+module git.x2erp.com/qdy/go-svc-worker
2
+
3
+go 1.25.4
4
+
5
+require (
6
+	git.x2erp.com/qdy/go-base v0.1.44
7
+	git.x2erp.com/qdy/go-db v0.1.42
8
+	github.com/gin-gonic/gin v1.11.0
9
+	github.com/gorilla/mux v1.8.1
10
+)
11
+
12
+require (
13
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
14
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
15
+	github.com/go-redis/redis/v8 v8.11.5 // indirect
16
+)
17
+
18
+require (
19
+	filippo.io/edwards25519 v1.1.0 // indirect
20
+	git.x2erp.com/qdy/go-service-agent v0.1.13
21
+	github.com/bytedance/sonic v1.14.0 // indirect
22
+	github.com/bytedance/sonic/loader v0.3.0 // indirect
23
+	github.com/cloudwego/base64x v0.1.6 // indirect
24
+	github.com/gabriel-vasile/mimetype v1.4.8 // indirect
25
+	github.com/gin-contrib/sse v1.1.0 // indirect
26
+	github.com/go-playground/locales v0.14.1 // indirect
27
+	github.com/go-playground/universal-translator v0.18.1 // indirect
28
+	github.com/go-playground/validator/v10 v10.27.0 // indirect
29
+	github.com/go-sql-driver/mysql v1.9.3 // indirect
30
+	github.com/goccy/go-json v0.10.2 // indirect
31
+	github.com/goccy/go-yaml v1.18.0 // indirect
32
+	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
33
+	github.com/golang-sql/sqlexp v0.1.0 // indirect
34
+	github.com/google/uuid v1.6.0 // indirect
35
+	github.com/json-iterator/go v1.1.12 // indirect
36
+	github.com/klauspost/cpuid/v2 v2.3.0 // indirect
37
+	github.com/leodido/go-urn v1.4.0 // indirect
38
+	github.com/lib/pq v1.10.9 // indirect
39
+	github.com/mattn/go-isatty v0.0.20 // indirect
40
+	github.com/microsoft/go-mssqldb v1.9.4 // indirect
41
+	github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
42
+	github.com/modern-go/reflect2 v1.0.2 // indirect
43
+	github.com/pelletier/go-toml/v2 v2.2.4 // indirect
44
+	github.com/quic-go/qpack v0.5.1 // indirect
45
+	github.com/quic-go/quic-go v0.54.0 // indirect
46
+	github.com/sijms/go-ora/v2 v2.9.0 // indirect
47
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
48
+	github.com/ugorji/go/codec v1.3.0 // indirect
49
+	go.uber.org/mock v0.5.0 // indirect
50
+	golang.org/x/arch v0.20.0 // indirect
51
+	golang.org/x/crypto v0.45.0 // indirect
52
+	golang.org/x/mod v0.29.0 // indirect
53
+	golang.org/x/net v0.47.0 // indirect
54
+	golang.org/x/sync v0.18.0 // indirect
55
+	golang.org/x/sys v0.38.0 // indirect
56
+	golang.org/x/text v0.31.0 // indirect
57
+	golang.org/x/tools v0.38.0 // indirect
58
+	google.golang.org/protobuf v1.36.9 // indirect
59
+	gopkg.in/yaml.v2 v2.4.0 // indirect
60
+)

+ 145
- 0
go.sum ファイルの表示

@@ -0,0 +1,145 @@
1
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3
+git.x2erp.com/qdy/go-base v0.1.9 h1:SuyYSt3Gp7aXiUQRCBNwhrusJ53wlCnagiTYs5eITlY=
4
+git.x2erp.com/qdy/go-base v0.1.9/go.mod h1:Q+YLwpCoU8CVSnzATLdz2LAzVMlz/CEGzo8DePf7cug=
5
+git.x2erp.com/qdy/go-base v0.1.10 h1:qHvRNSBoQHZfYrXUpZ42r925OO7aT95tIZK/qh6Cd60=
6
+git.x2erp.com/qdy/go-base v0.1.10/go.mod h1:Q+YLwpCoU8CVSnzATLdz2LAzVMlz/CEGzo8DePf7cug=
7
+git.x2erp.com/qdy/go-db v0.1.12 h1:z4VfTbIMNhBbpPmjRRtSjEkXet7nvVRjTd92+IFsGbw=
8
+git.x2erp.com/qdy/go-db v0.1.12/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
9
+git.x2erp.com/qdy/go-db v0.1.13 h1:gx1Ld+b3QRaO7VvyBm4fipafGkl0Yl+4ERzromAtck4=
10
+git.x2erp.com/qdy/go-db v0.1.13/go.mod h1:tcHV7sqEFYWbL/196NZxVnbdHevefRppggMTARVXQtE=
11
+git.x2erp.com/qdy/go-db v0.1.15 h1:YvwT/FyrvQQodzggGLyxlSQu++f7+NHDvkUR7tuDVfY=
12
+git.x2erp.com/qdy/go-db v0.1.15/go.mod h1:5dnPmDEOhfuKtV1anuSibSNibTINul6/qdRxH1khQ8k=
13
+git.x2erp.com/qdy/go-service-agent v0.1.13 h1:h5kMd9bGu6HcTQ60j/mqdtHC1HfJ7uxwOaYas3EjQZY=
14
+git.x2erp.com/qdy/go-service-agent v0.1.13/go.mod h1:51jbunlX5YI+LyUYaScojAGhra1dhnQL85QkbgVfnts=
15
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
16
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
17
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
18
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4=
19
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
20
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
21
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1 h1:Wgf5rZba3YZqeTNJPtvqZoBu1sBN/L4sry+u2U3Y75w=
22
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.3.1/go.mod h1:xxCBG/f/4Vbmh2XQJBsOmNdxWUY5j/s27jujKPbQf14=
23
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1 h1:bFWuoEKg+gImo7pvkiQEFAc8ocibADgXeiLAxWhWmkI=
24
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.1.1/go.mod h1:Vih/3yc6yac2JzU4hzpaDupBJP0Flaia9rXXrU8xyww=
25
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
26
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
27
+github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
28
+github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
29
+github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
30
+github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
31
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
32
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
33
+github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
34
+github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
35
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
36
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
37
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
38
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
39
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
40
+github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
41
+github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
42
+github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
43
+github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
44
+github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
45
+github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
46
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
47
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
48
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
49
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
50
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
51
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
52
+github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
53
+github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
54
+github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
55
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
56
+github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
57
+github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
58
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
59
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
60
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
61
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
62
+github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
63
+github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
64
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
65
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
66
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
67
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
68
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
69
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
70
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
71
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
72
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
73
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
74
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
75
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
76
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
77
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
78
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
79
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
80
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
81
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
82
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
83
+github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
84
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
85
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
86
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
87
+github.com/microsoft/go-mssqldb v1.9.4 h1:sHrj3GcdgkxytZ09aZ3+ys72pMeyEXJowT44j74pNgs=
88
+github.com/microsoft/go-mssqldb v1.9.4/go.mod h1:GBbW9ASTiDC+mpgWDGKdm3FnFLTUsLYN3iFL90lQ+PA=
89
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
90
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
91
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
92
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
93
+github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
94
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
95
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
96
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
97
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
98
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
99
+github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
100
+github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
101
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
102
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
103
+github.com/sijms/go-ora/v2 v2.9.0 h1:+iQbUeTeCOFMb5BsOMgUhV8KWyrv9yjKpcK4x7+MFrg=
104
+github.com/sijms/go-ora/v2 v2.9.0/go.mod h1:QgFInVi3ZWyqAiJwzBQA+nbKYKH77tdp1PYoCqhR2dU=
105
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
106
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
107
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
108
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
109
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
110
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
111
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
112
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
113
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
114
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
115
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
116
+github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
117
+github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
118
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
119
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
120
+golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
121
+golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
122
+golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
123
+golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
124
+golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
125
+golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
126
+golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
127
+golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
128
+golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
129
+golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
130
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
131
+golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
132
+golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
133
+golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
134
+golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
135
+golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
136
+golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
137
+google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
138
+google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
139
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
140
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
141
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
142
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
143
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
144
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
145
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 154
- 0
main.go ファイルの表示

@@ -0,0 +1,154 @@
1
+package main
2
+
3
+import (
4
+	"fmt"
5
+	"log"
6
+	"net/http"
7
+	"os"
8
+	"os/signal"
9
+	"strings"
10
+	"syscall"
11
+	"time"
12
+
13
+	"git.x2erp.com/qdy/go-base/config"
14
+	"git.x2erp.com/qdy/go-base/types"
15
+	"git.x2erp.com/qdy/go-db/factory/database"
16
+	"git.x2erp.com/qdy/go-svc-worker/service"
17
+	"github.com/gin-gonic/gin"
18
+)
19
+
20
+func main() {
21
+
22
+	cfg := config.GetConfig()
23
+
24
+	log.Printf("Service Port: %d", cfg.GetService().Port)
25
+	log.Printf("Service IdleTimeout: %d", cfg.GetService().IdleTimeout)
26
+	log.Printf("Service ReadTimeout: %d", cfg.GetService().ReadTimeout)
27
+	log.Printf("Service WriteTimeout: %d", cfg.GetService().WriteTimeout)
28
+	log.Printf("Service TrustedProxies: %s", cfg.GetService().TrustedProxies)
29
+
30
+	log.Printf("Using database type: %s", cfg.GetDatabase().Type)
31
+	log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
32
+	log.Printf("Database name: %s", cfg.GetDatabase().Database)
33
+	log.Println("Database connection test passed!")
34
+
35
+	// 3. 启动Gin HTTP服务
36
+	startHTTPServer()
37
+}
38
+
39
+// 启动HTTP服务器
40
+func startHTTPServer() {
41
+	//建立路由
42
+	router := gin.Default()
43
+	cfg := config.GetConfig()
44
+	serviceConfig := cfg.GetService()
45
+
46
+	dbFactory, err := database.GetDBFactory()
47
+	if err != nil {
48
+		log.Fatalf("Failed to create DB factory: %v", err)
49
+	}
50
+	// 设置优雅关闭
51
+	setupGracefulShutdown(dbFactory)
52
+	defer func() {
53
+		dbFactory.Close()
54
+		log.Println("Database connection closed")
55
+	}()
56
+
57
+	// 核心路由
58
+	//router.GET("/api/health", functions.HealthHandler(dbFactory, cfg.GetDatabase().Type))
59
+	//router.POST("/api/query", auth.AuthMiddleware(), withQueryRequest(functions.QueryToJSON(dbFactory)))
60
+	router.POST("/api/data/agent/to/doris", withQueryRequest(service.ServiceAgentToDoris(dbFactory)))
61
+	//router.POST("/api/query/csv/param", auth.AuthMiddleware(), withQueryRequest(functions.QueryPositionalToCSV(dbFactory)))
62
+	//router.GET("/api/info", functions.InfoHandler(dbFactory))
63
+
64
+	// 日志输出配置信息
65
+	log.Printf("Service Port: %d", serviceConfig.Port)
66
+	log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
67
+	log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
68
+	log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
69
+	log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
70
+
71
+	// 设置可信代理
72
+	setupTrustedProxies(router, serviceConfig.TrustedProxies)
73
+
74
+	// 创建HTTP服务器配置
75
+	server := &http.Server{
76
+		Addr:         fmt.Sprintf(":%d", serviceConfig.Port),
77
+		Handler:      router,
78
+		IdleTimeout:  time.Duration(serviceConfig.IdleTimeout) * time.Second,
79
+		ReadTimeout:  time.Duration(serviceConfig.ReadTimeout) * time.Second,
80
+		WriteTimeout: time.Duration(serviceConfig.WriteTimeout) * time.Second,
81
+	}
82
+
83
+	log.Printf("Starting HTTP server on port %d", serviceConfig.Port)
84
+	if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
85
+		log.Fatalf("Failed to start server: %v", err)
86
+	}
87
+
88
+}
89
+
90
+// 参数绑定包装器
91
+func withQueryRequest(handler func(c *gin.Context, req types.QueryRequest)) gin.HandlerFunc {
92
+	return func(c *gin.Context) {
93
+		var req types.QueryRequest
94
+		if err := c.ShouldBindJSON(&req); err != nil {
95
+			c.JSON(400, &types.QueryResult{
96
+				Success: false,
97
+				Error:   "Invalid request: " + err.Error(),
98
+				Data:    nil,
99
+			})
100
+			return
101
+		}
102
+
103
+		handler(c, req)
104
+	}
105
+}
106
+
107
+// 设置可信代理
108
+func setupTrustedProxies(router *gin.Engine, trustedProxiesStr string) {
109
+	if trustedProxiesStr == "" {
110
+		setupTrustedProxiesRouter(router, nil)
111
+		return
112
+	}
113
+
114
+	// 按逗号分割字符串,并去除空格
115
+	proxies := strings.Split(trustedProxiesStr, ",")
116
+	trimmedProxies := make([]string, 0, len(proxies))
117
+
118
+	for _, proxy := range proxies {
119
+		trimmed := strings.TrimSpace(proxy)
120
+		if trimmed != "" {
121
+			trimmedProxies = append(trimmedProxies, trimmed)
122
+		}
123
+	}
124
+
125
+	if len(trimmedProxies) > 0 {
126
+		setupTrustedProxiesRouter(router, trimmedProxies)
127
+	} else {
128
+		setupTrustedProxiesRouter(router, nil)
129
+	}
130
+}
131
+
132
+func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
133
+
134
+	err := router.SetTrustedProxies(trimmedProxies)
135
+	if err != nil {
136
+		log.Printf("Warning: Failed to set trusted proxies: %v", err)
137
+	} else {
138
+		log.Printf("Trusted proxies set: %v", trimmedProxies)
139
+	}
140
+
141
+}
142
+
143
+func setupGracefulShutdown(dbFactory *database.DBFactory) {
144
+	signalCh := make(chan os.Signal, 1)
145
+	signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
146
+
147
+	go func() {
148
+		<-signalCh
149
+		log.Println("\nReceived shutdown signal, closing database connection...")
150
+		dbFactory.Close()
151
+		log.Println("Database connection closed gracefully")
152
+		os.Exit(0)
153
+	}()
154
+}

+ 186
- 0
service/agentToDoris.go ファイルの表示

@@ -0,0 +1,186 @@
1
+package service
2
+
3
+import (
4
+	"fmt"
5
+	"log"
6
+	"strings"
7
+	"time"
8
+
9
+	"git.x2erp.com/qdy/go-base/types"
10
+	"git.x2erp.com/qdy/go-db/factory/database"
11
+	"git.x2erp.com/qdy/go-db/factory/doris"
12
+	"git.x2erp.com/qdy/go-db/factory/http"
13
+	"github.com/gin-gonic/gin"
14
+)
15
+
16
+// // QueryRequest 查询请求结构体
17
+// type QueryRequest struct {
18
+// 	SQL              string                 `json:"sql" binding:"required"`
19
+// 	Params           map[string]interface{} `json:"params,omitempty"`           // 名称参数
20
+// 	PositionalParams []interface{}          `json:"positionalParams,omitempty"` // 位置参数
21
+// 	WriterHeader     bool                   `json:"writerHeader"`               // 是否写入CSV头行
22
+// }
23
+
24
+// // QueryResult 查询结果
25
+// type QueryResult struct {
26
+// 	Success      bool          `json:"success"`
27
+// 	ErrorMessage string        `json:"errorMessage,omitempty"`
28
+// 	QueryTime    time.Duration `json:"queryTime"`
29
+// 	SaveTime     time.Duration `json:"saveTime"`
30
+// 	TotalRows    int           `json:"totalRows"`
31
+// 	CSVData      string        `json:"csvData,omitempty"`
32
+// }
33
+
34
+// queryToCSVAndInsert 处理单次查询并将结果插入到Doris
35
+func queryToCSVAndInsert(dbFactory *database.DBFactory, queryRequest types.QueryRequest) (*types.QueryResult, error) {
36
+
37
+	// 记录查询开始时间
38
+	queryStartTime := time.Now()
39
+
40
+	// 1. 获取HTTP工厂实例
41
+	httpFactory, err := http.GetHTTPFactory()
42
+	if err != nil {
43
+		return nil, fmt.Errorf("failed to get HTTP factory: %v", err)
44
+	}
45
+	log.Println("HTTP factory created successfully")
46
+
47
+	// 2. 获取Doris工厂实例
48
+	dorisFactory, err := doris.GetDorisFactory(httpFactory)
49
+	if err != nil {
50
+		return nil, fmt.Errorf("failed to get Doris factory: %v", err)
51
+	}
52
+	log.Println("Doris factory created successfully")
53
+
54
+	// 3. 创建HTTP客户端
55
+	httpClient := httpFactory.CreateClient()
56
+
57
+	agentQueryRequest := types.QueryRequest{
58
+		SQL:              queryRequest.SQL,
59
+		Params:           queryRequest.Params,
60
+		PositionalParams: queryRequest.PositionalParams,
61
+		WriterHeader:     queryRequest.WriterHeader,
62
+	}
63
+	// 4. 发送POST请求到 /api/query/csv 获取CSV格式数据
64
+	resp, err := httpClient.PostWithAuth(
65
+		queryRequest.AgentUrl,
66
+		agentQueryRequest,
67
+		queryRequest.AgentToken,
68
+		nil,
69
+	)
70
+
71
+	queryEndTime := time.Now()
72
+	queryDuration := queryEndTime.Sub(queryStartTime)
73
+
74
+	if err != nil {
75
+		return &types.QueryResult{
76
+			Success:   false,
77
+			Error:     fmt.Sprintf("查询失败: %v", err),
78
+			QueryTime: queryDuration,
79
+		}, nil
80
+	}
81
+
82
+	if resp.StatusCode() != 200 {
83
+		return &types.QueryResult{
84
+			Success:   false,
85
+			Error:     fmt.Sprintf("查询请求失败, 状态码: %d", resp.StatusCode()),
86
+			QueryTime: queryDuration,
87
+		}, nil
88
+	}
89
+
90
+	// 5. 获取CSV数据
91
+	csvData := string(resp.Body())
92
+	if len(csvData) == 0 {
93
+		return &types.QueryResult{
94
+			Success:   false,
95
+			Error:     "没有查询到数据",
96
+			QueryTime: queryDuration,
97
+		}, nil
98
+	}
99
+
100
+	// 估算数据行数(CSV行数)
101
+	var totalRows int
102
+	if queryRequest.WriterHeader {
103
+		// 如果有表头,需要减1
104
+		lines := strings.Count(csvData, "\n")
105
+		if lines > 0 {
106
+			totalRows = lines - 1
107
+		}
108
+	} else {
109
+		totalRows = strings.Count(csvData, "\n")
110
+	}
111
+
112
+	log.Printf("查询成功,获取到 %d 行数据\n", totalRows)
113
+
114
+	// 6. 插入数据到Doris
115
+	database := queryRequest.DorisDatabase
116
+	table := queryRequest.DorisTable
117
+	skipHeader := !queryRequest.WriterHeader // 如果包含表头,则跳过
118
+
119
+	saveStartTime := time.Now()
120
+	err = dorisFactory.InsertCSV(database, table, csvData, skipHeader)
121
+	saveEndTime := time.Now()
122
+	saveDuration := saveEndTime.Sub(saveStartTime)
123
+
124
+	if err != nil {
125
+		return &types.QueryResult{
126
+			Success:   false,
127
+			Error:     fmt.Sprintf("数据插入Doris失败: %v", err),
128
+			QueryTime: queryDuration,
129
+			SaveTime:  saveDuration,
130
+			Count:     totalRows,
131
+		}, nil
132
+	}
133
+
134
+	return &types.QueryResult{
135
+		Success:   true,
136
+		QueryTime: queryDuration,
137
+		SaveTime:  saveDuration,
138
+		Count:     totalRows,
139
+	}, nil
140
+}
141
+
142
+// ServiceHandler 服务处理器(供router使用)
143
+func ServiceAgentToDoris(dbFactory *database.DBFactory) func(c *gin.Context, req types.QueryRequest) {
144
+	return func(c *gin.Context, queryRequest types.QueryRequest) {
145
+		// 创建返回结果对象
146
+		result := &types.QueryResult{}
147
+
148
+		// 添加调试日志,确认 queryRequest 是否有数据
149
+		//log.Printf("SQL: %s", queryRequest.SQL)
150
+		//log.Printf("AgentUrl: %s", queryRequest.AgentUrl)
151
+		//log.Printf("参数数量: %d", len(queryRequest.PositionalParams))
152
+
153
+		// 执行查询并插入
154
+		executionResult, err := queryToCSVAndInsert(dbFactory, queryRequest)
155
+		if err != nil {
156
+			result.Success = false
157
+			result.Error = "服务内部错误: " + err.Error()
158
+			c.JSON(500, result)
159
+			return
160
+		}
161
+
162
+		// 使用QueryResult统一返回
163
+		result.Success = executionResult.Success
164
+		result.QueryTime = executionResult.QueryTime
165
+		result.SaveTime = executionResult.SaveTime
166
+		result.TotalCount = executionResult.TotalCount
167
+
168
+		// 计算总时间(秒)
169
+		totalTime := executionResult.QueryTime + executionResult.SaveTime
170
+		result.Time = totalTime.String()
171
+
172
+		// 根据执行结果设置其他字段
173
+		if executionResult.Success {
174
+			result.Data = gin.H{
175
+				"message": "数据成功插入到Doris",
176
+			}
177
+			result.Count = executionResult.TotalCount
178
+			c.JSON(200, result)
179
+		} else {
180
+			result.Error = executionResult.Error
181
+			result.Count = executionResult.TotalCount
182
+			// 注意:这里使用200而不是500,因为executionResult.Success=false可能表示业务逻辑失败而非服务器错误
183
+			c.JSON(200, result)
184
+		}
185
+	}
186
+}

+ 182
- 0
test/my_agent_to_doris_test.go ファイルの表示

@@ -0,0 +1,182 @@
1
+package test
2
+
3
+import (
4
+	"fmt"
5
+	"log"
6
+	"testing"
7
+
8
+	"git.x2erp.com/qdy/go-base/types"
9
+	"git.x2erp.com/qdy/go-db/factory/http"
10
+)
11
+
12
+// 函数名改为 TestAgentToDorisDirect 以符合 Go 测试约定
13
+func TestAgentToDorisDirect(t *testing.T) {
14
+	err := agentToDorisDirect(t)
15
+	if err != nil {
16
+		t.Errorf("测试失败: %v", err)
17
+	}
18
+}
19
+
20
+func agentToDorisDirect(t *testing.T) error {
21
+	startRow := 0
22
+	endRow := 5000
23
+	// 生成查询SQL(使用参数模式)
24
+	querySQL, queryParams := getSQLWithPagination(startRow, endRow)
25
+
26
+	// 准备查询请求
27
+	queryRequest := types.QueryRequest{
28
+		SQL:              querySQL,
29
+		PositionalParams: queryParams,
30
+		WriterHeader:     false,
31
+		AgentUrl:         "http://localhost:8080/api/query/csv/param",
32
+		AgentToken:       "123",
33
+		DorisDatabase:    "X6_STOCK_DEV",
34
+		DorisTable:       "A3_CLOTHING",
35
+	}
36
+
37
+	// 1. 获取HTTP工厂实例
38
+	httpFactory, err := http.GetHTTPFactory()
39
+	if err != nil {
40
+		log.Printf("Failed to get HTTP factory: %v", err)
41
+		return fmt.Errorf("Failed to get HTTP factory: %v", err)
42
+	}
43
+	fmt.Println("HTTP factory created successfully")
44
+
45
+	log.Printf("queryRequest:\n%s", "queryRequest")
46
+
47
+	// 发送POST请求到 /api/query/csv 获取CSV格式数据
48
+	httpClient := httpFactory.CreateClient()
49
+	resp, err := httpClient.PostWithAuth(
50
+		"http://localhost:9090/api/data/agent/to/doris",
51
+		queryRequest,
52
+		"123", // Bearer Token
53
+		nil,
54
+	)
55
+
56
+	if err != nil {
57
+		errMsg := fmt.Sprintf("请求失败: %v", err)
58
+		t.Error(errMsg)
59
+		return nil
60
+	}
61
+	log.Printf("查询结果:\n%s", resp)
62
+
63
+	//t.Logf("查询成功,响应数据长度: %d", resp)
64
+
65
+	return nil
66
+}
67
+
68
+// getSQLWithPagination 生成带分页的SQL语句(参数模式)
69
+// 返回SQL语句和参数映射
70
+func getSQLWithPagination(startRow, endRow int) (string, []interface{}) {
71
+	sql := `SELECT
72
+    CLOTHING_ID,
73
+    CLOTHING_YEAR,
74
+    CLOTHING_NAME,
75
+    STYLECOLOR_ID,
76
+    STYLE_ID,
77
+    COLOR_ID,
78
+    SIZE_ID,
79
+    CREATE_DATE,
80
+    STYLE_GROUP,
81
+    J_PRICE,
82
+    X_PRICE,
83
+    V_PRICE,
84
+    CLERK_ROYALTYRATE,
85
+    CLERK_ROYALTYPRICE,
86
+    BRAND_CODE,
87
+    STYLEVER_ID,
88
+    J_COST,
89
+    CLOTHING_IMG,
90
+    STYLE_UNIT_CODE,
91
+    STYLE_SEX_CODE,
92
+    STYLE_KIND_CODE,
93
+    STYLE_CLASS_CODE,
94
+    STYLE_SUBCLASS_CODE,
95
+    STYLE_DESIGNER_CODE,
96
+    STYLE_PLATER_CODE,
97
+    STYLE_STYLES_CODE,
98
+    STYLE_LOCATE_CODE,
99
+    STYLE_SALETYPE_CODE,
100
+    STYLE_COLORSYSTEM_CODE,
101
+    STYLE_THEME_CODE,
102
+    STYLE_INDENTTYPE_CODE,
103
+    STYLE_PRICEBAND_CODE,
104
+    STYLE_MONTH_CODE,
105
+    STYLE_COMPOSITION_CODE,
106
+    STYLE_SUPPLIER_CODE,
107
+    STYLE_SPARE1_CODE,
108
+    STYLE_SPARE2_CODE,
109
+    STYLE_SPARE4_CODE,
110
+    STYLE_SPARE5_CODE,
111
+    CATEGORY_CODE,
112
+    BRAND_ID,
113
+    STYCOLVER_ID,
114
+    STYLE_SAME,
115
+    CLOTHING_BARCODE,
116
+    CLOTHING_HELPID,
117
+    CLOTHING_GBCODE,
118
+    CLOTHING_RFID,
119
+    STYLE_SUBJECT_ID,
120
+    SIZEGRP_ID,
121
+    STYLE_HELPID,
122
+    CLOTHING_GBCODE1,
123
+    COLOR_NAME,
124
+    STYLEVER_NAME,
125
+    SIZE_NAME,
126
+    STYLE_UNIT,
127
+    STYLE_SEX,
128
+    STYLE_KIND,
129
+    STYLE_CLASS,
130
+    STYLE_SUBCLASS,
131
+    STYLE_DESIGNER,
132
+    STYLE_PLATER,
133
+    STYLE_BAND,
134
+    STYLE_STYLES,
135
+    STYLE_LOCATE,
136
+    STYLE_SALETYPE,
137
+    STYLE_COLORSYSTEM,
138
+    STYLE_THEME,
139
+    STYLE_INDENTTYPE,
140
+    STYLE_PRICEBAND,
141
+    STYLE_MONTH,
142
+    STYLE_COMPOSITION,
143
+    STYLE_SUPPLIER,
144
+    STYLE_SPARE1,
145
+    STYLE_SPARE2,
146
+    STYLE_SPARE3,
147
+    STYLE_SPARE4,
148
+    STYLE_SPARE5,
149
+    CATEGORY_NAME,
150
+    BRAND_NAME,
151
+    STYLE_YEAR_NAME,
152
+    STYLE_SEARCH_KEY,
153
+    STYLE_SUBJECT_NAME,
154
+    CLOTHING_REMARK,
155
+    STYLE_SPARE3_CODE,
156
+    COST,
157
+    BRAND_GROUPCODE,
158
+    CLASS_GROUPCODE,
159
+    MONTH_GROUPCODE,
160
+    RETURNSUBJECT_ID,
161
+    PRODUCT_SORT,
162
+    CLOTHING_PARTITION
163
+   FROM (
164
+    SELECT a.*, ROWNUM as rn
165
+    FROM (
166
+        SELECT *
167
+        FROM X6_STOCK_DEV.A3_CLOTHING 
168
+       
169
+        ORDER BY CLOTHING_ID
170
+    ) a
171
+    WHERE ROWNUM <= :1
172
+)
173
+WHERE rn > :2`
174
+
175
+	// 创建参数映射
176
+	params := []interface{}{
177
+		endRow,
178
+		startRow, // WHERE rn > :start_row 所以是startRow-1
179
+	}
180
+
181
+	return sql, params
182
+}

読み込み中…
キャンセル
保存