新增配置文件和工具版本,更新 Go 依赖项,修复部分控制器逻辑,优化 Excel 导出功能,调整前端 JS 代码,删除不必要的文件,提升代码可读性和维护性。

This commit is contained in:
danial
2025-05-27 23:19:21 +08:00
parent 58e0a49f8f
commit 071a8717bd
40 changed files with 1089 additions and 471 deletions

8
.hintrc Normal file
View File

@@ -0,0 +1,8 @@
{
"extends": [
"development"
],
"hints": {
"meta-viewport": "off"
}
}

1
.tool-versions Normal file
View File

@@ -0,0 +1 @@
python 3.13.3

View File

@@ -1,7 +1,7 @@
appname = jhmerchant appname = jhmerchant
httpport = 12307 httpport = 12307
#runmode = pro #runmode = pro
runmode = prod runmode = pro
HTTPAddr =0.0.0.0 HTTPAddr =0.0.0.0
shopAddr = 127.0.0.1:12305 shopAddr = 127.0.0.1:12305
@@ -12,11 +12,10 @@ portalAddr = 127.0.0.1:12400
[logs] [logs]
# 0 ~ 7, 日志级别 # 0 ~ 7, 日志级别
#level =7 #level =7
level =7 level = 0
#日志保存路径 #日志保存路径
filepath= ./logs/jhmerchant.log filepath= ./logs/jhmerchant.log
#需要显示的日志信息 #需要显示的日志信息
#separate="["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]"
separate="["emergency","alert","critical","error","warning","notice","info","debug"]" separate="["emergency","alert","critical","error","warning","notice","info","debug"]"
#日志保存最大天数 #日志保存最大天数
maxdays=10 maxdays=10

72
go.mod
View File

@@ -1,58 +1,82 @@
module merchant module merchant
go 1.23.0 go 1.24.0
toolchain go1.24.2 toolchain go1.24.2
require github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee require github.com/beego/beego/v2 v2.3.8
require ( require (
github.com/dchest/captcha v1.0.0 github.com/dchest/captcha v1.1.0
github.com/duke-git/lancet/v2 v2.3.5 github.com/duke-git/lancet/v2 v2.3.5
github.com/go-redis/redis v6.14.2+incompatible github.com/go-redis/redis v6.15.9+incompatible
github.com/go-sql-driver/mysql v1.8.1 github.com/go-sql-driver/mysql v1.9.2
github.com/natefinch/lumberjack v2.0.0+incompatible
github.com/panjf2000/ants/v2 v2.11.3 github.com/panjf2000/ants/v2 v2.11.3
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/rs/xid v1.6.0 github.com/rs/xid v1.6.0
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
github.com/tealeg/xlsx v1.0.5 github.com/tealeg/xlsx v1.0.5
github.com/xlzd/gotp v0.1.0 github.com/xlzd/gotp v0.1.0
github.com/xuri/excelize/v2 v2.9.0 github.com/xuri/excelize/v2 v2.9.1
go.opentelemetry.io/contrib/bridges/otelzap v0.11.0
go.opentelemetry.io/otel v1.36.0
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0
go.opentelemetry.io/otel/log v0.12.2
go.opentelemetry.io/otel/sdk v1.36.0
go.opentelemetry.io/otel/sdk/log v0.12.2
go.opentelemetry.io/otel/sdk/metric v1.36.0
go.opentelemetry.io/otel/trace v1.36.0
go.uber.org/zap v1.27.0
) )
require ( require (
filippo.io/edwards25519 v1.1.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect
github.com/BurntSushi/toml v1.5.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/klauspost/compress v1.17.11 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/lib/pq v1.10.9 // indirect github.com/lib/pq v1.10.9 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/ginkgo v1.16.5 // indirect
github.com/onsi/gomega v1.35.1 // indirect github.com/onsi/gomega v1.37.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.60.1 // indirect github.com/prometheus/common v0.64.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect
github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/mscfb v1.0.4 // indirect
github.com/richardlehane/msoleps v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.4 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 // indirect
github.com/tiendc/go-deepcopy v1.6.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect github.com/xuri/efp v0.0.1 // indirect
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect github.com/xuri/nfp v0.0.1 // indirect
golang.org/x/crypto v0.28.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect
golang.org/x/net v0.30.0 // indirect go.opentelemetry.io/proto/otlp v1.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.38.0 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/net v0.40.0 // indirect
golang.org/x/sync v0.14.0 // indirect golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.26.0 // indirect golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.19.0 // indirect golang.org/x/text v0.25.0 // indirect
google.golang.org/protobuf v1.35.1 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect
google.golang.org/grpc v1.72.2 // indirect
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )

166
go.sum
View File

@@ -1,30 +1,38 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee h1:j+mbzD7idTH1ktHDtFIqh//640NcsQ1k5ltwpKuWLTU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
github.com/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/beego/beego/v2 v2.3.8 h1:wplhB1pF4TxR+2SS4PUej8eDoH4xGfxuHfS7wAk9VBc=
github.com/beego/beego/v2 v2.3.8/go.mod h1:8vl9+RrXqvodrl9C8yivX1e6le6deCK6RWeq8R7gTTg=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= github.com/dchest/captcha v1.1.0 h1:2kt47EoYUUkaISobUdTbqwx55xvKOJxyScVfw25xzhQ=
github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo= github.com/dchest/captcha v1.1.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
github.com/duke-git/lancet/v2 v2.3.5 h1:vb49UWkkdyu2eewilZbl0L3X3T133znSQG0FaeJIBMg= github.com/duke-git/lancet/v2 v2.3.5 h1:vb49UWkkdyu2eewilZbl0L3X3T133znSQG0FaeJIBMg=
github.com/duke-git/lancet/v2 v2.3.5/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc= github.com/duke-git/lancet/v2 v2.3.5/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
@@ -33,16 +41,22 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -54,14 +68,14 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
@@ -71,8 +85,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg=
github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -80,21 +94,21 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00=
github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 h1:v9ezJDHA1XGxViAUSIoO/Id7Fl63u6d0YmsAm+/p2hs= github.com/shiena/ansicolor v0.0.0-20230509054315-a9deabde6e02 h1:v9ezJDHA1XGxViAUSIoO/Id7Fl63u6d0YmsAm+/p2hs=
@@ -107,34 +121,74 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo=
github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po=
github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg=
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d h1:llb0neMWDQe87IzJLS4Ci7psK/lVsjIS2otl+1WyRyY= github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8=
github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQE= github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw=
github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE= github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s=
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A= github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q=
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/bridges/otelzap v0.11.0 h1:u2E32P7j1a/gRgZDWhIXC+Shd4rLg70mnE7QLI/Ssnw=
go.opentelemetry.io/contrib/bridges/otelzap v0.11.0/go.mod h1:pJPCLM8gzX4ASqLlyAXjHBEYxgbOQJ/9bidWxD6PEPQ=
go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 h1:nRVXXvf78e00EwY6Wp0YII8ww2JVWshZ20HfTlE11AM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc=
go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E=
go.opentelemetry.io/otel/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:TU7eU/nib68C+4ZMQ5t4em5Jhf50kRorSCV4w+v65vo=
go.opentelemetry.io/otel/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:4AsFc5k1BDLWm5jt0yagrodTEA9xS9McwcnYm+Jf73A=
go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0=
go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY=
go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0=
go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:TY/N/FT7dmFrP/r5ym3g0yysP1DefqGpAZr4f82P0dE=
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -149,12 +203,12 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -162,23 +216,33 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0=
google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8=
google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -62,8 +62,8 @@ func (c *History) HistoryQueryAndListPage() {
// 计算分页数 // 计算分页数
count := account.GetAccountHistoryLenByMap(in) count := account.GetAccountHistoryLenByMap(in)
totalPage := count / limit // 计算总页数 totalPage := count / limit
if count%limit != 0 { // 不满一页的数据按一页计算 if count%limit != 0 {
totalPage++ totalPage++
} }
@@ -83,7 +83,7 @@ func (c *History) HistoryQueryAndListPage() {
} }
// 数据回显 // 数据回显
out := make(map[string]interface{}) out := make(map[string]any)
out["limit"] = limit // 分页数据 out["limit"] = limit // 分页数据
out["page"] = page out["page"] = page
out["totalPage"] = totalPage out["totalPage"] = totalPage

View File

@@ -1,27 +1,20 @@
package controllers package controllers
/***************************************************
** @Desc : This file for 处理Excel文件
** @Time : 19.12.6 16:25
** @Author : Joker
** @File : deal_excel
** @Last Modified by : Joker
** @Last Modified time: 19.12.6 16:25
** @Software: GoLand
****************************************************/
import ( import (
"bytes"
"fmt" "fmt"
"github.com/beego/beego/v2/core/logs"
"github.com/tealeg/xlsx"
"merchant/internal/models/merchant" "merchant/internal/models/merchant"
order2 "merchant/internal/models/order" order2 "merchant/internal/models/order"
"merchant/internal/models/payfor" "merchant/internal/models/payfor"
"merchant/internal/otelTrace"
"merchant/internal/sys/enum" "merchant/internal/sys/enum"
"merchant/internal/utils" "merchant/internal/utils"
"os" "os"
"strings" "strings"
"time" "time"
"github.com/beego/beego/v2/core/logs"
"github.com/tealeg/xlsx"
) )
type DealExcel struct { type DealExcel struct {
@@ -40,6 +33,7 @@ func (c *DealExcel) DownloadExcelModel() {
// 导出订单记录 // 导出订单记录
func (c *DealExcel) MakeOrderExcel() { func (c *DealExcel) MakeOrderExcel() {
ctx := c.Ctx.Request.Context()
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant.MerchantInfo) u := us.(merchant.MerchantInfo)
@@ -62,37 +56,33 @@ func (c *DealExcel) MakeOrderExcel() {
} }
var ( var (
msg = enum.FailedString msg = enum.FailedString
flag = enum.FailedFlag flag = enum.FailedFlag
fileName = "trade_order-" + pubMethod.GetNowTimeV2() + pubMethod.RandomString(6) + ".xlsx"
file *xlsx.File
sheet *xlsx.Sheet
row *xlsx.Row
cell *xlsx.Cell
err error
) )
// 数据获取 // 数据获取
list := order2.GetOrderProfitByMap(in, -1, 0) list := order2.GetOrderProfitByMap(ctx, in, -1, 0)
if len(list) <= 0 { if len(list) <= 0 {
msg = "没有检索到数据!" msg = "没有检索到数据!"
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
_ = c.ServeJSON()
c.StopRun()
} }
// 写入记录 // 写入记录
file = xlsx.NewFile() file := xlsx.NewFile()
sheet, err = file.AddSheet("订单记录") sheet, err := file.AddSheet("订单记录")
if err != nil { if err != nil {
utils.LogError(fmt.Sprintf("商户:%s 导出订单记录,发生错误:%v", u.MerchantName, err)) otelTrace.Logger.WithContext(ctx).Error(fmt.Sprintf("商户:%s 导出订单记录,发生错误:%v", u.MerchantName, err))
msg = enum.FailedToAdmin msg = enum.FailedToAdmin
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
_ = c.ServeJSON()
c.StopRun()
} }
// 第一行 // 第一行
row = sheet.AddRow() row := sheet.AddRow()
row.SetHeightCM(1) row.SetHeightCM(1)
cell = row.AddCell() cell := row.AddCell()
cell.Value = "平台订单号" cell.Value = "平台订单号"
cell = row.AddCell() cell = row.AddCell()
cell.Value = "商户订单号" cell.Value = "商户订单号"
@@ -119,10 +109,8 @@ func (c *DealExcel) MakeOrderExcel() {
addCell = addRow.AddCell() addCell = addRow.AddCell()
addCell.Value = fmt.Sprintf("%f", v.OrderAmount) addCell.Value = fmt.Sprintf("%f", v.OrderAmount)
var ( var st, t string
st = ""
t string
)
switch v.Status { switch v.Status {
case "failed": case "failed":
st = "交易失败" st = "交易失败"
@@ -143,20 +131,25 @@ func (c *DealExcel) MakeOrderExcel() {
addCell.Value = t addCell.Value = t
} }
err = file.Save(enum.ExcelDownloadPath + fileName) // 缓冲数据流到 response
buffer := bytes.NewBuffer(nil)
err = file.Write(buffer)
if err != nil { if err != nil {
utils.LogError(fmt.Sprintf("商户:%s 导出订单记录,保存文件发生错误:%v", u.MerchantName, err)) otelTrace.Logger.WithContext(ctx).Error(fmt.Sprintf("商户:%s 导出订单记录,保存文件发生错误:%v", u.MerchantName, err))
msg = enum.FailedToAdmin msg = enum.FailedToAdmin
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
_ = c.ServeJSON()
} }
flag = enum.SuccessFlag // force download
msg = fileName c.Ctx.Output.Header("Content-Disposition", "attachment; filename=订单记录.xlsx")
c.Ctx.Output.Header("Content-Type", "application/octet-stream")
c.Ctx.Output.Header("Content-Transfer-Encoding", "binary")
c.Ctx.Output.Header("Expires", "0")
c.Ctx.Output.Header("Cache-Control", "must-revalidate")
c.Ctx.Output.Header("Pragma", "public")
stopRun: c.Ctx.Output.Body(buffer.Bytes())
c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
_ = c.ServeJSON()
c.StopRun()
} }
// 下载excel // 下载excel
@@ -170,6 +163,7 @@ func (c *DealExcel) DownloadRecordExcel() {
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
} }
}() }()
// 删除临时文件 // 删除临时文件
go func() { go func() {
tk := time.NewTicker(5 * time.Minute) tk := time.NewTicker(5 * time.Minute)
@@ -226,7 +220,10 @@ func (c *DealExcel) MakeComplaintExcel() {
list := order2.GetOrderByMap(in, -1, 0) list := order2.GetOrderByMap(in, -1, 0)
if len(list) <= 0 { if len(list) <= 0 {
msg = "没有检索到数据!" msg = "没有检索到数据!"
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
_ = c.ServeJSON()
c.StopRun()
return
} }
// 写入记录 // 写入记录
@@ -235,7 +232,9 @@ func (c *DealExcel) MakeComplaintExcel() {
if err != nil { if err != nil {
utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,发生错误:%v", u.MerchantName, err)) utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,发生错误:%v", u.MerchantName, err))
msg = enum.FailedToAdmin msg = enum.FailedToAdmin
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
c.ServeJSON()
c.StopRun()
} }
// 第一行 // 第一行
@@ -282,16 +281,14 @@ func (c *DealExcel) MakeComplaintExcel() {
if err != nil { if err != nil {
utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,保存文件发生错误:%v", u.MerchantName, err)) utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,保存文件发生错误:%v", u.MerchantName, err))
msg = enum.FailedToAdmin msg = enum.FailedToAdmin
goto stopRun c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
c.ServeJSON()
c.StopRun()
} }
flag = enum.SuccessFlag flag = enum.SuccessFlag
msg = fileName msg = fileName
stopRun:
c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "")
c.ServeJSON()
c.StopRun()
} }
// 导出提现记录 // 导出提现记录

View File

@@ -2,12 +2,16 @@ package controllers
import ( import (
"fmt" "fmt"
"math"
"merchant/internal/models/account" "merchant/internal/models/account"
merchant2 "merchant/internal/models/merchant" merchant2 "merchant/internal/models/merchant"
order2 "merchant/internal/models/order" order2 "merchant/internal/models/order"
"merchant/internal/models/road" "merchant/internal/models/road"
"merchant/internal/sys/enum" "merchant/internal/sys/enum"
"strconv" "strconv"
"github.com/duke-git/lancet/v2/mathutil"
"github.com/duke-git/lancet/v2/slice"
) )
type Index struct { type Index struct {
@@ -19,7 +23,6 @@ func (c *Index) ShowUI() {
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant2.MerchantInfo) u := us.(merchant2.MerchantInfo)
c.Data["userName"] = u.MerchantName c.Data["userName"] = u.MerchantName
c.TplName = "index.html" c.TplName = "index.html"
} }
@@ -30,30 +33,26 @@ func (c *Index) LoadUserAccountInfo() {
ac := account.GetAccountByUid(u.MerchantUid) ac := account.GetAccountByUid(u.MerchantUid)
info := make(map[string]interface{}) info := make(map[string]any)
// 账户余额 // 账户余额
info["balanceAmt"] = pubMethod.FormatFloat64ToString(ac.Balance) info["balanceAmt"] = pubMethod.FormatFloat64ToString(ac.Balance)
// // 可用余额
// 可用余额 // info["settAmount"] = pubMethod.FormatFloat64ToString(ac.WaitAmount)
info["settAmount"] = pubMethod.FormatFloat64ToString(ac.WaitAmount) // // 冻结金额
// info["freezeAmt"] = pubMethod.FormatFloat64ToString(ac.FreezeAmount)
// 冻结金额 // // 押款金额
info["freezeAmt"] = pubMethod.FormatFloat64ToString(ac.FreezeAmount) // info["amountFrozen"] = pubMethod.FormatFloat64ToString(ac.LoanAmount)
// 押款金额
info["amountFrozen"] = pubMethod.FormatFloat64ToString(ac.LoanAmount)
c.Data["json"] = info c.Data["json"] = info
c.ServeJSON() c.ServeJSON(true)
c.StopRun()
} }
// LoadCountOrder 加载总订单信息 // LoadCountOrder 加载总订单信息
func (c *Index) LoadCountOrder() { func (c *Index) LoadCountOrder() {
ctx := c.Ctx.Request.Context()
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant2.MerchantInfo) u := us.(merchant2.MerchantInfo)
md := merchant2.GetMerchantDeployByUid(u.MerchantUid) md := merchant2.GetMerchantDeployByUid(ctx, u.MerchantUid)
type orderInPayWay struct { type orderInPayWay struct {
PayWayName string // 支付方式名 PayWayName string // 支付方式名
@@ -68,7 +67,7 @@ func (c *Index) LoadCountOrder() {
in := make(map[string]string) in := make(map[string]string)
in["merchant_uid"] = u.MerchantUid in["merchant_uid"] = u.MerchantUid
ways[k].PayWayName = road.GetRoadInfoByRoadUid(v.SingleRoadUid).ProductName ways[k].PayWayName = road.GetRoadInfoByRoadUid(ctx, v.SingleRoadUid).ProductName
in["road_uid"] = v.SingleRoadUid in["road_uid"] = v.SingleRoadUid
ways[k].OrderCount = order2.GetOrderLenByMap(in) ways[k].OrderCount = order2.GetOrderLenByMap(in)
@@ -90,12 +89,13 @@ func (c *Index) LoadCountOrder() {
// LoadOrderCount 加载总订单数 // LoadOrderCount 加载总订单数
func (c *Index) LoadOrderCount() { func (c *Index) LoadOrderCount() {
ctx := c.Ctx.Request.Context()
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant2.MerchantInfo) u := us.(merchant2.MerchantInfo)
out := make(map[string]interface{})
in := make(map[string]string) in := make(map[string]string)
out := make(map[string]any)
in["merchant_uid"] = u.MerchantUid in["merchant_uid"] = u.MerchantUid
out["orders"] = order2.GetOrderLenByMap(in) out["orders"] = order2.GetOrderLenByMap(in)
@@ -108,7 +108,7 @@ func (c *Index) LoadOrderCount() {
agentAll := 0.0 agentAll := 0.0
allAmount := 0.0 allAmount := 0.0
TadaySuccessNum := 0 TadaySuccessNum := 0
datainfo := order2.GetOrderProfitByMap(in, -1, 0) datainfo := order2.GetOrderProfitByMap(ctx, in, -1, 0)
for _, v := range datainfo { for _, v := range datainfo {
if v.Status != "success" { if v.Status != "success" {
@@ -121,25 +121,23 @@ func (c *Index) LoadOrderCount() {
TadaySuccessNum += 1 TadaySuccessNum += 1
} }
out["TadaySupplierProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", supplierAll), 3) out["TadaySupplierProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", supplierAll), 64)
out["TadayPlatformProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", platformAll), 3) out["TadayPlatformProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", platformAll), 64)
out["TadayAgentProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", agentAll), 3) out["TadayAgentProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", agentAll), 64)
out["TadayAllAmount"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", allAmount), 3) out["TadayAllAmount"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", allAmount), 64)
out["TadaySuccessNum"] = TadaySuccessNum out["TadaySuccessNum"] = TadaySuccessNum
out["TadayAllNum"] = len(datainfo) out["TadayAllNum"] = len(datainfo)
} }
if out["orders"].(int) == 0 { if out["orders"].(int) == 0 {
out["suc_rate"] = 0 out["suc_rate"] = 0
} else { } else {
out["suc_rate"] = fmt.Sprintf("%0.4f", float64(out["suc_orders"].(int))/float64(out["orders"].(int))) out["suc_rate"] = fmt.Sprintf("%0.4f", math.Round(float64(out["suc_orders"].(int))/float64(out["orders"].(int))*10000)/10000)
} }
c.Data["json"] = out c.Data["json"] = out
c.ServeJSON() c.ServeJSON()
c.StopRun()
} }
// LoadUserPayWayUI 加载用户支付配置 // LoadUserPayWayUI 加载用户支付配置
@@ -152,26 +150,138 @@ func (c *Index) LoadUserPayWayUI() {
} }
func (c *Index) LoadUserPayWay() { func (c *Index) LoadUserPayWay() {
ctx := c.Ctx.Request.Context()
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant2.MerchantInfo)
md := merchant2.GetMerchantDeployByUid(u.MerchantUid) u := us.(merchant2.MerchantInfo)
md := merchant2.GetMerchantDeployByUid(ctx, u.MerchantUid)
type payConfig struct { type payConfig struct {
No string // 通道编号 No string `json:"no"` // 通道编号
Name string // 产品名 Name string `json:"name"` // 产品名
Rate float64 // 通道费率 Rate float64 `json:"rate"` // 通道费率
Status string `json:"status"` // 通道状态
TodayAmount float64 `json:"todayAmount"` // 今日订单金额
TodayNum int `json:"todayNum"` // 今日订单数
TodaySucNum int `json:"todaySucNum"` // 今日成功订单数
TodaySucAmount float64 `json:"todaySucAmount"` // 今日成功订单金额
YesterdayAmount float64 `json:"yesterdayAmount"` // 昨日订单金额
YesterdayNum int `json:"yesterdayNum"` // 昨日订单数
YesterdaySucNum int `json:"yesterdaySucNum"` // 昨日成功订单数
YesterdaySucAmount float64 `json:"yesterdaySucAmount"` // 昨日成功订单金额
TodaySucRate float64 `json:"todaySucRate"` // 今日成功率
YesterdaySucRate float64 `json:"yesterdaySucRate"` // 昨日成功率
TotalAmount float64 `json:"totalAmount"` // 总订单金额
TotalNum int `json:"totalNum"` // 总订单数
TotalSucNum int `json:"totalSucNum"` // 总成功订单数
TotalSucRate float64 `json:"totalSucRate"` // 总成功率
TotalSucAmount float64 `json:"totalSucAmount"` // 总成功订单金额
} }
ways := make([]payConfig, len(md)) type TotalSummary struct {
TodayAmount float64 `json:"todayAmount"` // 今日订单金额
for k, v := range md { TodayNum int `json:"todayNum"` // 今日订单数
road_ := road.GetRoadInfoByRoadUid(v.SingleRoadUid) TodaySucNum int `json:"todaySucNum"` // 今日成功订单数
ways[k].No = road_.RoadUid TodaySucAmount float64 `json:"todaySucAmount"` // 今日成功订单金额
ways[k].Name = road_.RoadName YesterdayAmount float64 `json:"yesterdayAmount"` // 昨日订单金额
YesterdayNum int `json:"yesterdayNum"` // 昨日订单数
YesterdaySucNum int `json:"yesterdaySucNum"` // 昨日成功订单数
YesterdaySucAmount float64 `json:"yesterdaySucAmount"` // 昨日成功订单金额
TodaySucRate float64 `json:"todaySucRate"` // 今日成功率
YesterdaySucRate float64 `json:"yesterdaySucRate"` // 昨日成功率
TotalAmount float64 `json:"totalAmount"` // 总订单金额
TotalNum int `json:"totalNum"` // 总订单数
TotalSucNum int `json:"totalSucNum"` // 总成功订单数
TotalSucRate float64 `json:"totalSucRate"` // 总成功率
TotalSucAmount float64 `json:"totalSucAmount"` // 总成功订单金额
} }
c.Data["json"] = ways totalSummary := TotalSummary{}
ways := slice.Map(md, func(index int, item merchant2.MerchantDeployInfo) payConfig {
road_ := road.GetRoadInfoByRoadUid(ctx, item.SingleRoadUid)
config := payConfig{
No: item.SingleRoadUid,
Name: road_.RoadName,
Rate: item.RollRoadPlatformRate,
}
rates := slice.Map(item.PlatformRate(ctx), func(index int, item merchant2.ProfitMargin) float64 {
return item.Value
})
if len(rates) > 0 {
config.Rate = mathutil.Average(rates...)
}
summary := order2.GetSummaryByRoadAndMerchant(ctx, item.SingleRoadUid, u.MerchantUid)
if len(summary) == 0 {
return config
}
slice.ForEach(summary, func(index int, item order2.Summary) {
totalSummary.TotalAmount += item.TotalAmount
totalSummary.TotalNum += item.TotalNum
totalSummary.TotalSucNum += item.SuccessNum
totalSummary.TotalSucAmount += item.SuccessAmount
})
totalSummary.TodayAmount += summary[0].TotalAmount
totalSummary.TodayNum += summary[0].TotalNum
totalSummary.TodaySucNum += summary[0].SuccessNum
totalSummary.TodaySucAmount += summary[0].SuccessAmount
config.TodayAmount = summary[0].TotalAmount
config.TodayNum = summary[0].TotalNum
config.TodaySucNum = summary[0].SuccessNum
config.TodaySucAmount = summary[0].SuccessAmount
config.TodaySucRate = summary[0].Rate
if len(summary) > 1 {
totalSummary.YesterdayAmount += summary[1].TotalAmount
totalSummary.YesterdayNum += summary[1].TotalNum
totalSummary.YesterdaySucNum += summary[1].SuccessNum
totalSummary.YesterdaySucAmount += summary[1].SuccessAmount
config.YesterdayAmount = summary[1].TotalAmount
config.YesterdayNum = summary[1].TotalNum
config.YesterdaySucNum = summary[1].SuccessNum
config.YesterdaySucAmount = summary[1].SuccessAmount
config.YesterdaySucRate = summary[1].Rate
}
config.TotalAmount = mathutil.Sum(slice.Map(summary, func(index int, item order2.Summary) float64 {
return item.TotalAmount
})...)
config.TotalNum = mathutil.Sum(slice.Map(summary, func(index int, item order2.Summary) int {
return item.TotalNum
})...)
config.TotalSucNum = mathutil.Sum(slice.Map(summary, func(index int, item order2.Summary) int {
return item.SuccessNum
})...)
config.TotalSucAmount = mathutil.Sum(slice.Map(summary, func(index int, item order2.Summary) float64 {
return item.SuccessAmount
})...)
if config.TotalNum != 0 {
config.TotalSucRate = mathutil.RoundToFloat(float64(config.TotalSucNum)/float64(config.TotalNum), 4)
}
return config
})
if totalSummary.TodayNum != 0 {
totalSummary.TodaySucRate = mathutil.RoundToFloat(float64(totalSummary.TodaySucNum)/float64(totalSummary.TodayNum), 4)
}
if totalSummary.YesterdayNum != 0 {
totalSummary.YesterdaySucRate = mathutil.RoundToFloat(float64(totalSummary.YesterdaySucNum)/float64(totalSummary.YesterdayNum), 4)
}
if totalSummary.TotalNum != 0 {
totalSummary.TotalSucRate = mathutil.RoundToFloat(float64(totalSummary.TotalSucNum)/float64(totalSummary.TotalNum), 4)
}
response := struct {
Ways []payConfig `json:"ways"`
TotalSummary TotalSummary `json:"totalSummary"`
}{
Ways: ways,
TotalSummary: totalSummary,
}
c.Data["json"] = response
c.ServeJSON() c.ServeJSON()
c.StopRun()
} }

View File

@@ -34,7 +34,6 @@ func (c *KeepSession) Prepare() {
} }
_, b := c.Ctx.GetSecureCookie(uc.(string), enum.UserCookie) _, b := c.Ctx.GetSecureCookie(uc.(string), enum.UserCookie)
//utils.LogNotice(fmt.Sprintf("客户端cookie%s服务端cookie%s", cookie, uc.(string)))
if !b { if !b {
c.DelSession(enum.UserSession) c.DelSession(enum.UserSession)
c.Ctx.Redirect(302, "/") c.Ctx.Redirect(302, "/")

View File

@@ -1,10 +1,8 @@
package controllers package controllers
import ( import (
"merchant/internal/models/account"
"merchant/internal/models/merchant" "merchant/internal/models/merchant"
order2 "merchant/internal/models/order" order2 "merchant/internal/models/order"
"merchant/internal/service"
"merchant/internal/sys/enum" "merchant/internal/sys/enum"
"strconv" "strconv"
"strings" "strings"
@@ -105,16 +103,16 @@ func (c *TradeRecord) TradeQueryAndListPage() {
} }
// 数据回显 // 数据回显
out := make(map[string]interface{}) out := make(map[string]any)
out["limit"] = limit // 分页数据 out["limit"] = limit // 分页数据
out["page"] = page out["page"] = page
out["totalPage"] = totalPage out["totalPage"] = totalPage
out["root"] = res // 显示数据 out["root"] = res // 显示数据
out["profitSummary"] = account.ProfitSummary{ // out["profitSummary"] = account.ProfitSummary{
TotalProfit: service.QueryTotalSummary(in), // TotalProfit: service.QueryTotalSummary(in),
TodayProfit: service.QueryTodaySummary(in), // TodayProfit: service.QueryTodaySummary(in),
} // }
c.Data["json"] = out c.Data["json"] = out

View File

@@ -225,6 +225,7 @@ func (c *UserInfo) ResetTotp() {
} }
func (c *UserInfo) QueryAllowedRoad() { func (c *UserInfo) QueryAllowedRoad() {
ctx := c.Ctx.Request.Context()
us := c.GetSession(enum.UserSession) us := c.GetSession(enum.UserSession)
u := us.(merchant.MerchantInfo) u := us.(merchant.MerchantInfo)
if u.Id == 0 { if u.Id == 0 {
@@ -235,7 +236,7 @@ func (c *UserInfo) QueryAllowedRoad() {
_ = c.ServeJSON() _ = c.ServeJSON()
return return
} }
result := service.QueryAllowedRoad(u.MerchantUid) result := service.QueryAllowedRoad(ctx, u.MerchantUid)
c.Data["json"] = response.CommonResWithData{ c.Data["json"] = response.CommonResWithData{
CommonRes: response.CommonRes{ CommonRes: response.CommonRes{
Msg: "成功", Msg: "成功",
@@ -248,6 +249,7 @@ func (c *UserInfo) QueryAllowedRoad() {
// QueryAllowedMM 获取允许的面值 // QueryAllowedMM 获取允许的面值
func (c *UserInfo) QueryAllowedMM() { func (c *UserInfo) QueryAllowedMM() {
ctx := c.Ctx.Request.Context()
roadCode := c.GetString("roadCode") roadCode := c.GetString("roadCode")
if roadCode == "" { if roadCode == "" {
c.Data["json"] = response.CommonRes{ c.Data["json"] = response.CommonRes{
@@ -276,7 +278,7 @@ func (c *UserInfo) QueryAllowedMM() {
_ = c.ServeJSON() _ = c.ServeJSON()
return return
} }
result := service.QueryAllowedDeployInfoMM(u.MerchantUid, roadPool.RoadUid) result := service.QueryAllowedDeployInfoMM(ctx, u.MerchantUid, roadPool.RoadUid)
returnList := make([]struct { returnList := make([]struct {
ShowLabel float64 `json:"showLabel"` ShowLabel float64 `json:"showLabel"`
}, 0) }, 0)

View File

@@ -40,7 +40,6 @@ func GetAccountByUid(accountUid string) AccountInfo {
if err != nil { if err != nil {
logs.Error("get account by uid fail: ", err) logs.Error("get account by uid fail: ", err)
} }
return account return account
} }

View File

@@ -1,19 +1,13 @@
package merchant package merchant
/***************************************************
** @Desc : This file for ...
** @Time : 2019/10/7 11:52
** @Author : yuebin
** @File : merchant_deploy_info
** @Last Modified by : yuebin
** @Last Modified time: 2019/10/7 11:52
** @Software: GoLand
****************************************************/
import ( import (
"context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"merchant/internal/otelTrace"
"github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/client/orm"
"go.uber.org/zap"
"github.com/beego/beego/v2/core/logs" "github.com/beego/beego/v2/core/logs"
) )
@@ -41,6 +35,14 @@ type MerchantDeployInfo struct {
CreateTime string CreateTime string
} }
func (m *MerchantDeployInfo) PlatformRate(ctx context.Context) []ProfitMargin {
list := []ProfitMargin{}
if err := json.Unmarshal([]byte(m.SingleRoadPlatformRate), &list); err != nil {
otelTrace.Logger.WithContext(ctx).Error("unmarshal single road platform rate fail: ", zap.Error(err))
}
return list
}
func (m *MerchantDeployInfo) GetSingleRoadPlatformRateMapping() (map[int]float64, error) { func (m *MerchantDeployInfo) GetSingleRoadPlatformRateMapping() (map[int]float64, error) {
myMap := make(map[int]float64) myMap := make(map[int]float64)
@@ -96,9 +98,9 @@ func GetMerchantDeployByUidAndPayType(uid, payType string) MerchantDeployInfo {
return merchantDeployInfo return merchantDeployInfo
} }
func GetMerchantDeployByUid(uid string) (ms []MerchantDeployInfo) { func GetMerchantDeployByUid(ctx context.Context, uid string) (ms []MerchantDeployInfo) {
o := orm.NewOrm() o := orm.NewOrm()
_, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).All(&ms) _, err := o.QueryTable(MERCHANT_DEPLOY_INFO).Filter("merchant_uid", uid).AllWithCtx(ctx, &ms)
if err != nil { if err != nil {
logs.Error("get merchant deploy by uid fail:", err) logs.Error("get merchant deploy by uid fail:", err)
} }

View File

@@ -1,16 +1,8 @@
package merchant package merchant
/***************************************************
** @Desc : This file for ...
** @Time : 2019/9/28 16:47
** @Author : yuebin
** @File : merchant_info
** @Last Modified by : yuebin
** @Last Modified time: 2019/9/28 16:47
** @Software: GoLand
****************************************************/
import ( import (
"context"
"github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs" "github.com/beego/beego/v2/core/logs"
) )
@@ -41,30 +33,33 @@ type MerchantInfo struct {
} }
type ProfitMargin struct { type ProfitMargin struct {
FactLabel float64 `json:"factLabel"` Sort int `json:"sort" orm:"sort,omitempty"`
ShowLabel float64 `json:"showLabel"` ShowLabel float64 `json:"showLabel" orm:"show_label,omitempty"`
LinkID string `json:"linkID"` FactLabel float64 `json:"factLabel" orm:"fact_label,omitempty"`
Value float64 `json:"value" orm:"value,omitempty"`
PlatformLabel string `json:"platformLabel" description:"平台" orm:"platform_label,omitempty"`
IsLinkSingle bool `json:"isLinkSingle" description:"链接是否单独放置" orm:"is_link_single,omitempty"`
LinkID string `json:"linkID" orm:"link_id,omitempty"`
} }
const MERCHANT_INFO = "merchant_info" const MERCHANT_INFO = "merchant_info"
func IsExistByMerchantName(merchantName string) bool { func IsExistByMerchantName(ctx context.Context, merchantName string) bool {
o := orm.NewOrm() o := orm.NewOrm()
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_name", merchantName).Exist() exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_name", merchantName).ExistWithCtx(ctx)
return exist
}
func IsExistByMerchantUid(ctx context.Context, uid string) bool {
o := orm.NewOrm()
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", uid).ExistWithCtx(ctx)
return exist return exist
} }
func IsExistByMerchantUid(uid string) bool { func IsExistMerchantByAgentUid(ctx context.Context, uid string) bool {
o := orm.NewOrm() o := orm.NewOrm()
exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", uid).Exist() exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).ExistWithCtx(ctx)
return exist
}
func IsExistMerchantByAgentUid(uid string) bool {
o := orm.NewOrm()
exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).Exist()
return exist return exist
} }

View File

@@ -1,15 +1,5 @@
package merchant package merchant
/***************************************************
** @Desc : This file for ...
** @Time : 2019/11/22 13:07
** @Author : yuebin
** @File : merchant_load_info
** @Last Modified by : yuebin
** @Last Modified time: 2019/11/22 13:07
** @Software: GoLand
****************************************************/
import ( import (
"github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs" "github.com/beego/beego/v2/core/logs"

View File

@@ -1,10 +1,13 @@
package order package order
import ( import (
"context"
"merchant/internal/models/account"
"merchant/internal/otelTrace"
"strings"
"github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs" "github.com/beego/beego/v2/core/logs"
"merchant/internal/models/account"
"strings"
) )
type OrderProfitInfo struct { type OrderProfitInfo struct {
@@ -93,7 +96,7 @@ func GetOrderProfitLenByMap(params map[string]string) int {
return int(cnt) return int(cnt)
} }
func GetOrderProfitByMap(params map[string]string, display, offset int) []OrderProfitInfo { func GetOrderProfitByMap(ctx context.Context, params map[string]string, display, offset int) []OrderProfitInfo {
o := orm.NewOrm() o := orm.NewOrm()
var orderProfitInfoList []OrderProfitInfo var orderProfitInfoList []OrderProfitInfo
qs := o.QueryTable(ORDER_PROFIT_INFO) qs := o.QueryTable(ORDER_PROFIT_INFO)
@@ -102,9 +105,9 @@ func GetOrderProfitByMap(params map[string]string, display, offset int) []OrderP
qs = qs.Filter(k, v) qs = qs.Filter(k, v)
} }
} }
_, err := qs.Limit(display, offset).OrderBy("-create_time").All(&orderProfitInfoList) _, err := qs.Limit(display, offset).OrderBy("-create_time").AllWithCtx(ctx, &orderProfitInfoList)
if err != nil { if err != nil {
logs.Error("get order by map fail: ", err) otelTrace.Logger.WithContext(ctx).Error("查询失败")
} }
return orderProfitInfoList return orderProfitInfoList
} }

View File

@@ -1,13 +1,66 @@
package order package order
import (
"context"
"time"
"github.com/beego/beego/v2/client/orm"
"github.com/duke-git/lancet/v2/slice"
)
// Summary 订单总结 // Summary 订单总结
type Summary struct { type Summary struct {
TotalNum int `json:"totalNum"` // 提交订单数 TotalNum int `json:"totalNum"` // 提交订单数
TotalAmount float64 `json:"totalAmount"` // 订单总金额 TotalAmount float64 `json:"totalAmount"` // 订单总金额
PaidNum int `json:"paidNum"` // 已付订单数 Rate float64 `json:"rate"` // 成功率
PaidAmount float64 `json:"paidAmount"` // 已付总金额 SuccessNum int `json:"successNum"` // 成功订单数
PlatformIncome float64 `json:"platformIncome"` // 平台收入 SuccessAmount float64 `json:"successAmount"` // 成功订单总金额
MerchantIncome float64 `json:"merchantIncome"` // 商户收入 Date time.Time `json:"date"` // 日期
AgencyIncome float64 `json:"agencyIncome"` // 代理收入 }
ChannelCost float64 `json:"channelCost"` // 通道成本
func GetSummaryByRoadAndMerchant(ctx context.Context, roadUid, merchantUid string) (summariesList []Summary) {
o := orm.NewOrm()
summariesList = make([]Summary, 0)
sql := `
SELECT
COUNT(id) AS totalNum,
SUM(order_info.order_amount) AS totalAmount,
COUNT(CASE WHEN order_info.status = 'success' THEN 1 END) AS successNum,
SUM(CASE WHEN order_info.status = 'success' THEN order_info.order_amount ELSE 0 END) AS successAmount,
DATE(create_time) AS date
FROM
order_info
WHERE
order_info.road_uid = ? AND
order_info.merchant_uid = ?
GROUP BY
DATE(create_time)
`
o.RawWithCtx(ctx, sql, roadUid, merchantUid).QueryRows(&summariesList)
if len(summariesList) == 0 {
return
}
// 补齐从今天到第一天中空缺天的数据
firstDate := summariesList[0].Date
for date := time.Now(); date.After(firstDate); date = date.AddDate(0, 0, -1) {
if slice.ContainBy(summariesList, func(item Summary) bool {
return item.Date.Format("2006-01-02") == date.Format("2006-01-02")
}) {
continue
}
summariesList = append(summariesList, Summary{Date: date})
}
// 计算成功率
for _, summary := range summariesList {
if summary.TotalNum == 0 {
summary.Rate = 0
continue
}
summary.Rate = float64(summary.SuccessNum) / float64(summary.TotalNum)
}
return
} }

View File

@@ -1,38 +1,50 @@
package road package road
import ( import (
"context"
"merchant/internal/otelTrace"
"time"
"github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs" "github.com/beego/beego/v2/core/logs"
"go.uber.org/zap"
) )
type RoadInfo struct { type RoadInfo struct {
Id int Id int
Status string Status string
RoadName string RoadName string
RoadUid string RoadUid string
Remark string Remark string
ProductName string ProductName string
ProductUid string ProductUid string
PayType string PayType string
BasicFee float64 BasicFee float64
SettleFee float64 SettleFee float64
TotalLimit float64 TotalLimit float64
TodayLimit float64 TodayLimit float64
SingleMinLimit float64 SingleMinLimit float64
SingleMaxLimit float64 SingleMaxLimit float64
StarHour int StarHour int
EndHour int EndHour int
Params string Params string
TodayIncome float64 TodayIncome float64
TotalIncome float64 TotalIncome float64
TodayProfit float64 TodayProfit float64
TotalProfit float64 TotalProfit float64
Balance float64 Balance float64
RequestAll int RequestAll int
RequestSuccess int RequestSuccess int
UpdateTime string TodayRequestAll int `json:"TodayRequestAll"`
CreateTime string TodayRequestSuccess int
ProductCode string IsAllowDifferentResend int
TransactionType string
PaymentHtml string
ProductCode string
CreateTime time.Time
UpdateTime time.Time
} }
type SimpleRoadInfo struct { type SimpleRoadInfo struct {
@@ -42,12 +54,12 @@ type SimpleRoadInfo struct {
const ROAD_INFO = "road_info" const ROAD_INFO = "road_info"
func GetRoadInfoByRoadUid(roadUid string) RoadInfo { func GetRoadInfoByRoadUid(ctx context.Context, roadUid string) RoadInfo {
o := orm.NewOrm() o := orm.NewOrm()
var roadInfo RoadInfo var roadInfo RoadInfo
_, err := o.QueryTable(ROAD_INFO).Exclude("status", "delete").Filter("road_uid", roadUid).Limit(1).All(&roadInfo) _, err := o.QueryTable(ROAD_INFO).Exclude("status", "delete").Filter("road_uid", roadUid).Limit(1).All(&roadInfo)
if err != nil { if err != nil {
logs.Error("get road info by road uid fail: ", err) otelTrace.Logger.WithContext(ctx).Error("get road info by road uid fail: ", zap.Error(err))
} }
return roadInfo return roadInfo
} }

317
internal/otelTrace/init.go Normal file
View File

@@ -0,0 +1,317 @@
package otelTrace
import (
"context"
"log/slog"
"net/http"
"os"
"github.com/beego/beego/v2/core/config/env"
"github.com/natefinch/lumberjack"
"github.com/beego/beego/v2/server/web"
beecontext "github.com/beego/beego/v2/server/web/context"
"go.opentelemetry.io/contrib/bridges/otelzap"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/log/global"
"go.opentelemetry.io/otel/propagation"
sdklog "go.opentelemetry.io/otel/sdk/log"
sdkMetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"time"
"go.opentelemetry.io/otel/trace"
)
// InitCtx 初始化ctx
var (
InitCtx = context.Background()
)
type LoggerStruct struct {
logger *zap.Logger
}
// WithContext 为日志记录器添加上下文信息。
// 如果上下文中包含跟踪 id则将其添加到日志中以增强可追踪性。
func (l *LoggerStruct) WithContext(ctx context.Context) *zap.Logger {
// 如果上下文为空,直接返回日志记录器,不进行任何修改。
if ctx == nil {
return l.logger
}
// 从 context 中获取 span
// 从 context 中获取 span
span := trace.SpanFromContext(ctx)
if !span.SpanContext().IsValid() {
if l.logger == nil {
return zap.NewNop()
}
return l.logger
}
return l.logger.With(zap.Reflect("ctx", ctx)).With(zap.String("span", span.SpanContext().TraceID().String()))
}
var (
serviceName = "网关服务——" + env.Get("serverName", "")
collectorURL = "otel-collector.kkknametrans.buzz"
Logger *LoggerStruct // 添加全局 logger
)
func InitTracer() (func(context.Context) error, func(context.Context) error, func(context.Context) error) {
traceExporter, err := otlptrace.New(
InitCtx,
otlptracehttp.NewClient(
otlptracehttp.WithInsecure(),
otlptracehttp.WithCompression(otlptracehttp.GzipCompression),
otlptracehttp.WithEndpoint(collectorURL),
),
)
if err != nil {
slog.ErrorContext(InitCtx, "failed to create trace exporter", slog.String("error", err.Error()))
return nil, nil, nil
}
resources, err := resource.New(
InitCtx,
resource.WithAttributes(
attribute.String("service.name", serviceName),
attribute.String("library.language", "go"),
),
)
if err != nil {
slog.ErrorContext(InitCtx, "failed to create resources", slog.String("error", err.Error()))
return nil, nil, nil
}
otel.SetTracerProvider(
sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithSpanProcessor(sdktrace.NewBatchSpanProcessor(traceExporter,
sdktrace.WithBatchTimeout(30*time.Second),
sdktrace.WithMaxExportBatchSize(100),
)),
sdktrace.WithBatcher(traceExporter),
sdktrace.WithResource(resources),
),
)
// Set up meter provider.
metricExporter, err := otlpmetrichttp.New(
InitCtx,
otlpmetrichttp.WithInsecure(),
otlpmetrichttp.WithCompression(otlpmetrichttp.GzipCompression),
otlpmetrichttp.WithEndpoint(collectorURL))
if err != nil {
slog.ErrorContext(InitCtx, "failed to create trace exporter", slog.String("error", err.Error()))
return nil, nil, nil
}
otel.SetMeterProvider(
sdkMetric.NewMeterProvider(
sdkMetric.WithReader(
sdkMetric.NewPeriodicReader(
metricExporter,
sdkMetric.WithInterval(30*time.Second),
),
),
sdkMetric.WithResource(resources),
),
)
logExporter, err := otlploghttp.New(
InitCtx,
otlploghttp.WithCompression(otlploghttp.GzipCompression),
otlploghttp.WithInsecure(),
otlploghttp.WithEndpoint(collectorURL),
)
if err != nil {
slog.ErrorContext(InitCtx, "failed to create log exporter", slog.String("error", err.Error()))
return nil, nil, nil
}
loggerProvider := sdklog.NewLoggerProvider(
sdklog.WithProcessor(
sdklog.NewBatchProcessor(logExporter, sdklog.WithExportMaxBatchSize(100)),
),
sdklog.WithResource(resources),
)
global.SetLoggerProvider(loggerProvider)
// 自定义日志格式配置
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder, // 使用大写字母记录日志级别
EncodeTime: zapcore.TimeEncoderOfLayout(time.DateTime), // ISO8601 时间格式
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder, // 短路径编码器
}
lumberjacklogger := &lumberjack.Logger{
Filename: "./logs/log-rotate-test.log",
MaxSize: 10, //MB
MaxBackups: 20,
MaxAge: 15, //days
Compress: true, // disabled by default
}
defer lumberjacklogger.Close()
// 日志需要保存在本地,并且每日更新
core := zapcore.NewTee(
otelzap.NewCore(serviceName, otelzap.WithLoggerProvider(loggerProvider)),
zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
zapcore.NewMultiWriteSyncer(
zapcore.AddSync(os.Stdout),
zapcore.AddSync(lumberjacklogger),
),
zap.InfoLevel,
),
)
logger := zap.New(core,
zap.AddCaller(),
zap.AddStacktrace(zap.ErrorLevel),
)
// zap设置标准输出流
// 设置全局 logger
Logger = &LoggerStruct{
logger: logger,
}
// 确保设置 TextMapPropagator
otel.SetTextMapPropagator(
propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}),
)
return traceExporter.Shutdown, metricExporter.Shutdown, logExporter.Shutdown
}
// Middleware 从请求头中提取上游的 trace context
// 并将其注入到当前的 context 中
// 这样下游的服务就可以从 context 中获取到上游的 trace context
// 这样就可以在日志中看到上游的 trace Context
func Middleware(ctx *beecontext.Context, next web.FilterFunc) {
req := ctx.Request
// 从请求头中提取上游的 trace context
propagator := otel.GetTextMapPropagator()
parentCtx := propagator.Extract(req.Context(), propagation.HeaderCarrier(req.Header))
routeTrace := otel.Tracer("router")
spanCtx, span := routeTrace.Start(parentCtx, req.URL.Path,
trace.WithAttributes(
attribute.String("http.method", req.Method),
attribute.String("http.url", req.URL.String()),
attribute.String("peer.hostname", req.Host),
attribute.String("http.scheme", getScheme(req)),
attribute.String("component", "beego"),
attribute.String("peer.address", req.RemoteAddr),
attribute.String("span.kind", "server"),
attribute.String("peer.service", serviceName),
attribute.String("http.flavor", req.Proto),
attribute.String("http.user_agent", req.UserAgent()),
attribute.String("http.target", req.URL.Path),
),
)
// 合并所有 defer 处理到一个函数中
defer func() {
// 先处理状态码
if ctx.Request.Response != nil {
span.SetAttributes(attribute.Int("http.status_code", ctx.Request.Response.StatusCode))
}
// 处理 panic
if err := recover(); err != nil {
span.RecordError(err.(error))
span.SetAttributes(attribute.String("error", "true"))
Logger.WithContext(ctx.Request.Context()).Error("全局错误", zap.Any("error", err))
// 结束 span
span.End()
// 重新抛出异常
panic(err)
}
// 正常情况下结束 span
span.End()
}()
ctx.Request = ctx.Request.WithContext(spanCtx)
next(ctx)
}
// Span 抽象span
func Span(ctx context.Context, traceName, spanName string, attr ...trace.SpanStartOption) (context.Context, func()) {
ctx, span := otel.Tracer(traceName).Start(ctx, spanName, attr...)
return ctx, func() {
defer span.End()
}
}
func getScheme(req *http.Request) string {
scheme := req.Header.Get("X-Forwarded-Proto")
if scheme == "" && req.TLS != nil {
scheme = "https"
} else if scheme == "" {
scheme = "http"
}
return scheme
}
func NewSchedulerTrace(opts ...trace.TracerOption) trace.Tracer {
return otel.Tracer("scheduler", opts...)
}
func init() {
// 初始化日志
// 自定义日志格式配置
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder, // 使用大写字母记录日志级别
EncodeTime: zapcore.TimeEncoderOfLayout(time.DateTime), // ISO8601 时间格式
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder, // 短路径编码器
}
lumberjacklogger := &lumberjack.Logger{
Filename: "./logs/log-rotate-test.log",
MaxSize: 10, //MB
MaxBackups: 20,
MaxAge: 15, //days
Compress: true, // disabled by default
}
defer lumberjacklogger.Close()
// 创建核心
core := zapcore.NewTee(
zapcore.NewCore(
zapcore.NewConsoleEncoder(encoderConfig),
zapcore.NewMultiWriteSyncer(
zapcore.AddSync(os.Stdout),
zapcore.AddSync(lumberjacklogger),
),
zap.InfoLevel,
),
)
logger := zap.New(core,
zap.AddCaller(),
// zap.AddCallerSkip(1),
zap.AddStacktrace(zap.ErrorLevel),
)
// zap设置标准输出流
// 设置全局 logger
Logger = &LoggerStruct{
logger: logger,
}
}

View File

@@ -1,15 +1,16 @@
package service package service
import ( import (
"context"
"encoding/json" "encoding/json"
"merchant/internal/models/merchant" "merchant/internal/models/merchant"
"merchant/internal/models/road" "merchant/internal/models/road"
) )
// QueryAllowedDeployInfoMM 获取指定商户的允许面额信息 // QueryAllowedDeployInfoMM 获取指定商户的允许面额信息
func QueryAllowedDeployInfoMM(merchantUid, roadUid string) []merchant.ProfitMargin { func QueryAllowedDeployInfoMM(ctx context.Context, merchantUid, roadUid string) []merchant.ProfitMargin {
resInfo := make([]merchant.ProfitMargin, 0) resInfo := make([]merchant.ProfitMargin, 0)
merchantInfoList := merchant.GetMerchantDeployByUid(merchantUid) merchantInfoList := merchant.GetMerchantDeployByUid(ctx, merchantUid)
if len(merchantInfoList) == 0 { if len(merchantInfoList) == 0 {
return resInfo return resInfo
} }
@@ -25,9 +26,9 @@ func QueryAllowedDeployInfoMM(merchantUid, roadUid string) []merchant.ProfitMarg
} }
// QueryAllowedRoad 获取商户允许通道信息 // QueryAllowedRoad 获取商户允许通道信息
func QueryAllowedRoad(merchantUid string) []road.SimpleRoadInfo { func QueryAllowedRoad(ctx context.Context, merchantUid string) []road.SimpleRoadInfo {
var resInfo []road.SimpleRoadInfo var resInfo []road.SimpleRoadInfo
merchantInfoList := merchant.GetMerchantDeployByUid(merchantUid) merchantInfoList := merchant.GetMerchantDeployByUid(ctx, merchantUid)
if len(merchantInfoList) == 0 { if len(merchantInfoList) == 0 {
return resInfo return resInfo
} }

Binary file not shown.

View File

@@ -1,11 +1,123 @@
/*************************************************** let excel = {
** @Desc : This file for 导出Excel文件 download_trade_order_excel: function () {
** @Time : 19.12.7 16:48 let startTime = $("#startTime").val();
** @Author : Joker let endTime = $("#endTime").val();
** @File : deal_excel let payType = $("#payType").val();
** @Last Modified by : Joker let uStatus = $("#uStatus").val();
** @Last Modified time: 19.12.7 16:48 $.ajax({
** @Software: GoLand type: "GET",
****************************************************/ url: "/excel/make_order_excel/",
data: {
let excel={download_trade_order_excel:function(){let startTime=$("#startTime").val();let endTime=$("#endTime").val();let payType=$("#payType").val();let uStatus=$("#uStatus").val();$.ajax({type:"GET",url:"/excel/make_order_excel/",data:{start:startTime,end:endTime,pay_type:payType,status:uStatus,},cache:true,success:function(res){if(res.code===9){let $form=$("<form method='get'></form>");$form.attr("action","/excel/download_excel/"+res.msg);$(document.body).append($form);$form.submit()}else{toastr.error(res.msg)}},error:function(XMLHttpRequest){toastr.info('something is wrong, code: '+XMLHttpRequest.status)}})},download_complaint_record_excel:function(){let startTime=$("#startTime").val();let endTime=$("#endTime").val();let payType=$("#payType").val();let uStatus=$("#uStatus").val();$.ajax({type:"GET",url:"/excel/make_complaint_record_excel/",data:{start:startTime,end:endTime,pay_type:payType,status:uStatus,},cache:true,success:function(res){if(res.code===9){let $form=$("<form method='get'></form>");$form.attr("action","/excel/download_excel/"+res.msg);$(document.body).append($form);$form.submit()}else{toastr.error(res.msg)}},error:function(XMLHttpRequest){toastr.info('something is wrong, code: '+XMLHttpRequest.status)}})},download_withdraw_record_excel:function(){let startTime=$("#startTime").val();let endTime=$("#endTime").val();let uStatus=$("#uStatus").val();$.ajax({type:"GET",url:"/excel/make_withdraw_record_excel/",data:{start:startTime,end:endTime,status:uStatus,},cache:true,success:function(res){if(res.code===9){let $form=$("<form method='get'></form>");$form.attr("action","/excel/download_excel/"+res.msg);$(document.body).append($form);$form.submit()}else{toastr.error(res.msg)}},error:function(XMLHttpRequest){toastr.info('something is wrong, code: '+XMLHttpRequest.status)}})},download_recharge_record_excel:function(){let startTime=$("#startTime").val();let endTime=$("#endTime").val();let uStatus=$("#uStatus").val();$.ajax({type:"GET",url:"/excel/make_recharge_record_excel/",data:{start:startTime,end:endTime,status:uStatus,},cache:true,success:function(res){if(res.code===9){let $form=$("<form method='get'></form>");$form.attr("action","/excel/download_excel/"+res.msg);$(document.body).append($form);$form.submit()}else{toastr.error(res.msg)}},error:function(XMLHttpRequest){toastr.info('something is wrong, code: '+XMLHttpRequest.status)}})}}; start: startTime,
end: endTime,
pay_type: payType,
status: uStatus,
},
xhrFields: {
responseType: "blob"
},
success: function (res) {
// 下载二进制流
const blob = new Blob([res], {
type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
})
const url = window.URL.createObjectURL(blob)
let a = document.createElement("a");
a.href = url;
a.download = "订单记录.xlsx";
a.target = "_blank";
a.click();
a.remove();
},
error: function (res) {
toastr.info('something is wrong, code: ' + res.status)
},
})
},
download_complaint_record_excel: function () {
let startTime = $("#startTime").val();
let endTime = $("#endTime").val();
let payType = $("#payType").val();
let uStatus = $("#uStatus").val();
$.ajax({
type: "GET",
url: "/excel/make_complaint_record_excel/",
data: {
start: startTime,
end: endTime,
pay_type: payType,
status: uStatus,
},
cache: true,
success: function (res) {
if (res.code === 9) {
let $form = $("<form method='get'></form>");
$form.attr("action", "/excel/download_excel/" + res.msg);
$(document.body).append($form);
$form.submit()
} else {
toastr.error(res.msg)
}
},
error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
}
})
},
download_withdraw_record_excel: function () {
let startTime = $("#startTime").val();
let endTime = $("#endTime").val();
let uStatus = $("#uStatus").val();
$.ajax({
type: "GET",
url: "/excel/make_withdraw_record_excel/",
data: {
start: startTime,
end: endTime,
status: uStatus,
},
cache: true,
success: function (res) {
if (res.code === 9) {
let $form = $("<form method='get'></form>");
$form.attr("action", "/excel/download_excel/" + res.msg);
$(document.body).append($form);
$form.submit()
} else {
toastr.error(res.msg)
}
},
error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
}
})
},
download_recharge_record_excel: function () {
let startTime = $("#startTime").val();
let endTime = $("#endTime").val();
let uStatus = $("#uStatus").val();
$.ajax({
type: "GET",
url: "/excel/make_recharge_record_excel/",
data: {
start: startTime,
end: endTime,
status: uStatus,
},
cache: true,
success: function (res) {
if (res.code === 9) {
let $form = $("<form method='get'></form>");
$form.attr("action", "/excel/download_excel/" + res.msg);
$(document.body).append($form);
$form.submit()
} else {
toastr.error(res.msg)
}
},
error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
}
})
}
};

View File

@@ -1,13 +1,3 @@
/***************************************************
** @Desc : This file for 表单验证js
** @Time : 19.12.3 11:17
** @Author : Joker
** @File : form_validate
** @Last Modified by : Joker
** @Last Modified time: 19.12.3 11:17
** @Software: GoLand
****************************************************/
let form_v = { let form_v = {
modify_userInfo: function () { modify_userInfo: function () {
let or_pwd = $("#or_pwd").val(); let or_pwd = $("#or_pwd").val();

View File

@@ -1,90 +1,106 @@
/***************************************************
** @Desc : This file for 首页js
** @Time : 19.12.2 14:46
** @Author : Joker
** @File : index
** @Last Modified by : Joker
** @Last Modified time: 19.12.2 14:46
** @Software: GoLand
****************************************************/
let index = { let index = {
getAccountInfo: function() { getAccountInfo: function () {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "/index/loadInfo/", url: "/index/loadInfo/",
success: function(result) { success: function (result) {
$("#balanceAmt").text(result["balanceAmt"]); $("#balanceAmt").text(result["balanceAmt"]);
$("#settAmount").text(result["settAmount"]); $("#settAmount").text(result["settAmount"]);
$("#freezeAmt").text(result["freezeAmt"]); $("#freezeAmt").text(result["freezeAmt"]);
$("#amountFrozen").text(result["amountFrozen"]) $("#amountFrozen").text(result["amountFrozen"])
}, },
error: function(XMLHttpRequest) { error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status) toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
} }
}) })
}, },
getOrdersInfo: function() { getOrdersInfo: function () {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "/index/loadOrders", url: "/index/loadOrders",
success: function(result) { success: function (result) {
$("#orders").text(result["orders"]); $("#orders").text(result["orders"]);
$("#suc_orders").text(result["suc_orders"]); $("#suc_orders").text(result["suc_orders"]);
$("#suc_rate").text((result["suc_rate"] * 100).toFixed(2) + "%") $("#suc_rate").text((result["suc_rate"] * 100).toFixed(2) + "%")
}, },
error: function(XMLHttpRequest) { error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status) toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
} }
}) })
}, },
get_account_balance: function() { get_account_balance: function () {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "/withdraw/balance", url: "/withdraw/balance",
success: function(resp) { success: function (resp) {
$("#balance").val(resp.balance); $("#balance").val(resp.balance);
$("#sett_fee").html(resp.fee) $("#sett_fee").html(resp.fee)
}, },
error: function(XMLHttpRequest) { error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status) toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
} }
}) })
}, },
loadTradeRecord: function() { loadTradeRecord: function () {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "/index/load_count_order", url: "/index/load_count_order",
success: function(res) { success: function (res) {
let con = ""; let con = "";
$.each(res, function(index, item) { $.each(res, function (index, item) {
if (item.PayWayName === "") { if (item.PayWayName === "") {
return true return true
} }
con += `<div class="project"><div class="row bg-white has-shadow"><div class="left-col col-lg-1 d-flex align-items-center justify-content-between"><small>` + (index + 1) + `</small></div><div class="left-col col-lg-3 d-flex align-items-center justify-content-between"><small>` + item.PayWayName + `</small></div><div class="left-col col-lg-2 d-flex align-items-center justify-content-between"><small>` + item.OrderCount + `</small></div><div class="left-col col-lg-2 d-flex align-items-center justify-content-between"><small>` + item.SucOrderCount + `</small></div><div class="left-col col-lg-2 d-flex align-items-center justify-content-between"><small>` + (item.SucRate * 100).toFixed(2) + `%</small></div></div></div>` con += `<div class="project"><div class="row bg-white has-shadow"><div class="left-col d-flex align-items-center justify-content-between"><small>` + (index + 1) + `</small></div><div class="left-col d-flex align-items-center justify-content-between"><small>` + item.PayWayName + `</small></div><div class="left-col d-flex align-items-center justify-content-between"><small>` + item.OrderCount + `</small></div><div class="left-col d-flex align-items-center justify-content-between"><small>` + item.SucOrderCount + `</small></div><div class="left-col d-flex align-items-center justify-content-between"><small>` + (item.SucRate * 100).toFixed(2) + `%</small></div></div></div>`
}); });
$("#your_showtime").html(con) $("#your_showtime").html(con)
}, },
error: function(XMLHttpRequest) { error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status) toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
} }
}) })
}, },
loadPayWay: function() { loadPayWay: function () {
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "/index/pay_way", url: "/index/pay_way",
success: function(res) { success: function (res) {
let con = ""; let con = "";
$.each(res, function(index, item) { $.each(res.ways, function (index, item) {
if (item.Name === "") { if (item.name === "") {
return true return true
} }
con += `<div class="project"><div class="row bg-white has-shadow"><div class="left-col col-lg-1 d-flex align-items-center justify-content-between"><small>` + (index + 1) + `</small></div><div class="left-col col-lg-3 d-flex align-items-center justify-content-between"><small>` + item.Name + `</small></div><div class="left-col col-lg-2 d-flex align-items-center justify-content-between"><small>` + item.Rate + `%</small></div></div></div>` con += `<div class="project">
<div class="row bg-white has-shadow">
<div class="left-col col-lg-1 d-flex align-items-center justify-content-between">
<small>` +
(index + 1) +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.name +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.rate +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.todayAmount +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.todaySucRate +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.yesterdayAmount +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.yesterdaySucRate +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.totalAmount +
`</small></div><div class="left-col col-1 d-flex align-items-center justify-content-between"><small>` +
item.totalSucRate +
`%</small>
</div>
</div>
</div>`
}); });
$("#your_showtime").html(con) $("#your_showtime").html(con)
const totalRow = `今日跑量:${res.totalSummary.todayAmount} 昨日跑量:${res.totalSummary.yesterdayAmount} 总跑量:${res.totalSummary.totalAmount},总成率:${res.totalSummary.totalSucRate}%`
$("#total_showtime_row").html(totalRow)
}, },
error: function(XMLHttpRequest) { error: function (XMLHttpRequest) {
toastr.info('something is wrong, code: ' + XMLHttpRequest.status) toastr.info('something is wrong, code: ' + XMLHttpRequest.status)
} }
}) })

View File

@@ -1,13 +1,3 @@
/***************************************************
** @Desc : This file for 交易记录js
** @Time : 19.12.3 15:01
** @Author : Joker
** @File : trade_record
** @Last Modified by : Joker
** @Last Modified time: 19.12.3 15:01
** @Software: GoLand
****************************************************/
let trade = { let trade = {
get_last_month_date: function () { get_last_month_date: function () {
let date = new Date(); let date = new Date();
@@ -68,7 +58,8 @@ let trade = {
ss = "0" + ss ss = "0" + ss
} }
return strYear + "-" + strMonth + "-" + strDay + " " + hh + ":" + mm + ":" + ss return strYear + "-" + strMonth + "-" + strDay + " " + hh + ":" + mm + ":" + ss
}, trade_do_paging: function () { },
trade_do_paging: function () {
let merchantNo = $("#merchant_No").val(); let merchantNo = $("#merchant_No").val();
let startTime = $("#startTime").val(); let startTime = $("#startTime").val();
let endTime = $("#endTime").val(); let endTime = $("#endTime").val();
@@ -98,15 +89,15 @@ let trade = {
numberOfPages: data.limit, numberOfPages: data.limit,
itemTexts: function (type, page) { itemTexts: function (type, page) {
switch (type) { switch (type) {
case"first": case "first":
return "首页"; return "首页";
case"prev": case "prev":
return "上一页"; return "上一页";
case"next": case "next":
return "下一页"; return "下一页";
case"last": case "last":
return "末页"; return "末页";
case"page": case "page":
return page return page
} }
}, },
@@ -139,15 +130,18 @@ let trade = {
$.each(list, function (index, item) { $.each(list, function (index, item) {
let bg_red = "", st = "", t = ""; let bg_red = "", st = "", t = "";
switch (item.Status) { switch (item.Status) {
case"failed": case "failed":
case "fail": case "fail":
st = "交易失败"; st = "交易失败";
bg_red = ` style="color: red"`; bg_red = ` style="color: red"`;
break; break;
case"wait": case "created":
st = "创建订单";
break;
case "wait":
st = "等待支付"; st = "等待支付";
break; break;
case"success": case "success":
bg_red = ` style="color: green"`; bg_red = ` style="color: green"`;
st = "交易成功"; st = "交易成功";
t = item.UpdateTime; t = item.UpdateTime;
@@ -215,15 +209,15 @@ let trade = {
numberOfPages: data.limit, numberOfPages: data.limit,
itemTexts: function (type, page) { itemTexts: function (type, page) {
switch (type) { switch (type) {
case"first": case "first":
return "首页"; return "首页";
case"prev": case "prev":
return "上一页"; return "上一页";
case"next": case "next":
return "下一页"; return "下一页";
case"last": case "last":
return "末页"; return "末页";
case"page": case "page":
return page return page
} }
}, },
@@ -256,10 +250,10 @@ let trade = {
$.each(list, function (index, item) { $.each(list, function (index, item) {
let st = ""; let st = "";
switch (item.FreezeOrder) { switch (item.FreezeOrder) {
case"yes": case "yes":
st = "已冻结"; st = "已冻结";
break; break;
case"no": case "no":
st = "已退款"; st = "已退款";
break break
} }

View File

@@ -1,13 +1,3 @@
/***************************************************
** @Desc : This file for ...
** @Time : 19.12.6 13:43
** @Author : Joker
** @File : withdraw_record
** @Last Modified by : Joker
** @Last Modified time: 19.12.6 13:43
** @Software: GoLand
****************************************************/
let pay = { let pay = {
withdraw_do_paging: function () { withdraw_do_paging: function () {
let bankNo = $("#bankNo").val(); let bankNo = $("#bankNo").val();

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class=" list-unstyled "> <ul id="exampledropdownDropdown1" class=" list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li class="active"><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li class="active"><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i
@@ -73,7 +73,7 @@
<div class="breadcrumb-holder container-fluid"> <div class="breadcrumb-holder container-fluid">
<ul class="breadcrumb"> <ul class="breadcrumb">
<li class="breadcrumb-item"><a href="/index/ui/">首页</a></li> <li class="breadcrumb-item"><a href="/index/ui/">首页</a></li>
<li class="breadcrumb-item active">投诉列表</li> <!-- <li class="breadcrumb-item active">投诉列表</li> -->
</ul> </ul>
</div> </div>
<!-- Forms Section--> <!-- Forms Section-->

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation" style="color: black;"></i>订单管理 </a> class="icon icon-presentation" style="color: black;"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>

View File

@@ -2,8 +2,9 @@
<html> <html>
<head> <head>
{{template "template/css.html"}} <meta charset="utf-8">
</head>
{{template "template/css.html"}}
</head> </head>
<body> <body>
@@ -44,7 +45,7 @@
class="icon icon-presentation" style="color: black;"></i>订单管理 </a> class="icon icon-presentation" style="color: black;"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i
@@ -83,47 +84,6 @@
<div class="number"><strong id="balanceAmt">0.00</strong></div> <div class="number"><strong id="balanceAmt">0.00</strong></div>
</div> </div>
</div> </div>
<!-- Item -->
<div class="col-xl-3 col-sm-4">
<div class="item d-flex align-items-center">
<div class="icon bg-red"><i class="icon icon-check"></i></div>
<div class="title"><span>可提现金额<br><small>&nbsp;</small></span>
<div class="progress">
<div role="progressbar" style="width: 80%; height: 4px;" aria-valuenow="70"
aria-valuemin="0" aria-valuemax="100" class="progress-bar bg-red"></div>
</div>
</div>
<div class="number"><strong id="settAmount">0.00</strong></div>
</div>
</div>
<!-- Item -->
<div class="col-xl-3 col-sm-4">
<div class="item d-flex align-items-center">
<div class="icon bg-blue"><i class="icon icon-flask"></i></div>
<div class="title"><span>冻结金额<br><small>(出款在途金额)</small></span>
<div class="progress">
<div role="progressbar" style="width: 80%; height: 4px;" aria-valuenow="50"
aria-valuemin="0" aria-valuemax="100" class="progress-bar bg-blue">
</div>
</div>
</div>
<div class="number"><strong id="freezeAmt">0.00</strong></div>
</div>
</div>
<!-- Item -->
<div class="col-xl-3 col-sm-4">
<div class="item d-flex align-items-center">
<div class="icon bg-secondary"><i class="icon icon-interface-windows"></i></div>
<div class="title"><span>押款金额<br><small>(D+1 结算金额)</small></span>
<div class="progress">
<div role="progressbar" style="width: 80%; height: 4px;" aria-valuenow="50"
aria-valuemin="0" aria-valuemax="100" class="progress-bar bg-secondary">
</div>
</div>
</div>
<div class="number"><strong id="amountFrozen">0.00</strong></div>
</div>
</div>
</div> </div>
</div> </div>
</section> </section>
@@ -142,32 +102,6 @@
</h2> </h2>
</div> </div>
</header> </header>
<!-- Projects Section-->
<!-- <section class="projects no-padding-bottom">
<div class="container-fluid">
<div class="project">
<div class="row bg-white has-shadow">
<div class="left-col col-lg-1 d-flex align-items-center justify-content-between">
<h3 class="h4"># </h3>
</div>
<div class="left-col col-lg-3 d-flex align-items-center justify-content-between">
<h3 class="h4">通道名称<small>&nbsp;&nbsp;通道名相同但产品不同</small></h3>
</div>
<div class="left-col col-lg-2 d-flex align-items-center justify-content-between">
<h3 class="h4">订单数</h3>
</div>
<div class="left-col col-lg-2 d-flex align-items-center justify-content-between">
<h3 class="h4">成功订单数</h3>
</div>
<div class="left-col col-lg-2 d-flex align-items-center justify-content-between">
<h3 class="h4">成功率</h3>
</div>
</div>
</div>
<div id="your_showtime">
</div>
</div>
</section> -->
</div> </div>
</div> </div>
</div> </div>

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i
@@ -77,22 +77,48 @@
<div class="project"> <div class="project">
<div class="row bg-white has-shadow"> <div class="row bg-white has-shadow">
<div <div
class="left-col col-lg-1 d-flex align-items-center justify-content-between"> class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4"># </h3> <h3 class="h4"># </h3>
</div> </div>
<div <div
class="left-col col-lg-3 d-flex align-items-center justify-content-between"> class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">通道名称<small>&nbsp;&nbsp;通道名相同但产品不同</small></h3> <h3 class="h4">通道名称<small>&nbsp;&nbsp;通道名相同但产品不同</small></h3>
</div> </div>
<div <div
class="left-col col-lg-2 d-flex align-items-center justify-content-between"> class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">费率</h3> <h3 class="h4">费率(<span id="rate">仅供参考</span>)</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">今日跑量</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">今日成率</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">昨日跑量</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">昨日成率</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">总跑量</h3>
</div>
<div
class="left-col col-1 d-flex align-items-center justify-content-between">
<h3 class="h4">总成率</h3>
</div> </div>
</div> </div>
</div> </div>
<div id="your_showtime"> <div id="your_showtime">
</div>
<div id="total_showtime">
<div class="row bg-white has-shadow" id="total_showtime_row">
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation" style="color: black;"></i>订单管理 </a> class="icon icon-presentation" style="color: black;"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>

View File

@@ -44,8 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i

View File

@@ -43,7 +43,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class=" list-unstyled "> <ul id="exampledropdownDropdown1" class=" list-unstyled ">
<li class="active"><a href="/trade/show_ui">订单记录</a></li> <li class="active"><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>
<li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i <li><a href="#exampledropdownDropdown2" aria-expanded="false" data-toggle="collapse"> <i
@@ -115,7 +115,7 @@
</label> </label>
</div> </div>
<div style="padding: 20px; color: red"> <!-- <div style="padding: 20px; color: red">
<div class="row"> <div class="row">
<div class="col-sm-2 color-red"> <div class="col-sm-2 color-red">
订单总量: 订单总量:
@@ -133,10 +133,6 @@
成功交易总量: 成功交易总量:
<span id="SucceedPaidAmount"></span> <span id="SucceedPaidAmount"></span>
</div> </div>
<!-- <div class="color-red">-->
<!-- 手续费:-->
<!-- <span id="supplierProfit"></span>-->
<!-- </div>-->
<div class="col-sm-2 color-red" style="font-weight: normal;"> <div class="col-sm-2 color-red" style="font-weight: normal;">
平台利润: 平台利润:
<span id="platformProfit"></span> <span id="platformProfit"></span>
@@ -145,10 +141,6 @@
成功率: 成功率:
<span id="totalSucceedRate"></span>% <span id="totalSucceedRate"></span>%
</div> </div>
<!-- <div class="color-red" style="font-weight: normal;">-->
<!-- 代理利润:-->
<!-- <span id="agentProfit"></span>-->
<!-- </div>-->
</div> </div>
<div class="row"> <div class="row">
<div class="col-sm-2 color-red" style="font-weight: normal;"> <div class="col-sm-2 color-red" style="font-weight: normal;">
@@ -167,11 +159,6 @@
今日成功订单总金额: 今日成功订单总金额:
<span id="TodayPaidAmount"></span> <span id="TodayPaidAmount"></span>
</div> </div>
<!-- <div class="color-red" style="font-weight: normal;">-->
<!-- 今日通道成本:-->
<!-- <span id="TodaySupplierProfit"></span>-->
<!-- </div>-->
<div class="col-sm-2 color-red" style="font-weight: normal;"> <div class="col-sm-2 color-red" style="font-weight: normal;">
今日平台利润: 今日平台利润:
<span id="TodayPlatformProfit"></span> <span id="TodayPlatformProfit"></span>
@@ -180,12 +167,8 @@
成功率: 成功率:
<span id="todaySucceedRate"></span>% <span id="todaySucceedRate"></span>%
</div> </div>
<!-- <div class="color-red" style="font-weight: normal;">-->
<!-- 今日代理润:-->
<!-- <span id="TodayAgentProfit"></span>-->
<!-- </div>-->
</div> </div>
</div> </div> -->
<div class="card-body"> <div class="card-body">
<div class="table-responsive"> <div class="table-responsive">

View File

@@ -42,7 +42,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>

View File

@@ -44,7 +44,7 @@
class="icon icon-presentation"></i>订单管理 </a> class="icon icon-presentation"></i>订单管理 </a>
<ul id="exampledropdownDropdown1" class="collapse list-unstyled "> <ul id="exampledropdownDropdown1" class="collapse list-unstyled ">
<li><a href="/trade/show_ui">订单记录</a></li> <li><a href="/trade/show_ui">订单记录</a></li>
<li><a href="/trade/show_complaint_ui">投诉列表</a></li> <!-- <li><a href="/trade/show_complaint_ui">投诉列表</a></li> -->
</ul> </ul>
</li> </li>