From 071a8717bda2fae8085c099f1166b9ce2d9f2992 Mon Sep 17 00:00:00 2001 From: danial Date: Tue, 27 May 2025 23:19:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=92=8C=E5=B7=A5=E5=85=B7=E7=89=88=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20Go=20=E4=BE=9D=E8=B5=96=E9=A1=B9=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96=20Excel=20?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=20JS=20=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7=E5=92=8C=E7=BB=B4=E6=8A=A4=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hintrc | 8 + .tool-versions | 1 + conf/app.conf | 5 +- go.mod | 72 ++++-- go.sum | 166 +++++++++---- internal/controllers/account_history.go | 6 +- internal/controllers/deal_excel.go | 97 ++++---- internal/controllers/index.go | 190 +++++++++++--- internal/controllers/keep_session.go | 1 - internal/controllers/trade_record.go | 12 +- internal/controllers/user_info.go | 6 +- internal/models/account/account.go | 1 - internal/models/merchant/deploy_info.go | 26 +- internal/models/merchant/info.go | 43 ++-- internal/models/merchant/load_info.go | 10 - internal/models/order/profit_info.go | 13 +- internal/models/order/summary.go | 69 +++++- internal/models/road/road_info.go | 70 +++--- internal/otelTrace/init.go | 317 ++++++++++++++++++++++++ internal/service/deploy_info.go | 9 +- static/code/demo.zip | Bin 2089 -> 0 bytes static/js/deal_excel.js | 134 +++++++++- static/js/form_validate.js | 10 - static/js/index.js | 76 +++--- static/js/trade_record.js | 46 ++-- static/js/withdraw_account_list.js | 10 - views/complaint_record.html | 4 +- views/gen_link.html | 2 +- views/history_record.html | 2 +- views/index.html | 74 +----- views/modify_userInfo.html | 2 +- views/pay_way.html | 40 ++- views/query_order.html | 2 +- views/recharge_record.html | 2 +- views/show_userInfo.html | 3 +- views/totp.html | 2 +- views/trade_record.html | 23 +- views/withdraw/multi_withdraw.html | 2 +- views/withdraw/withdraw.html | 2 +- views/withdraw/withdraw_record.html | 2 +- 40 files changed, 1089 insertions(+), 471 deletions(-) create mode 100644 .hintrc create mode 100644 .tool-versions create mode 100644 internal/otelTrace/init.go delete mode 100644 static/code/demo.zip diff --git a/.hintrc b/.hintrc new file mode 100644 index 0000000..5b18485 --- /dev/null +++ b/.hintrc @@ -0,0 +1,8 @@ +{ + "extends": [ + "development" + ], + "hints": { + "meta-viewport": "off" + } +} \ No newline at end of file diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..a75f84a --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +python 3.13.3 diff --git a/conf/app.conf b/conf/app.conf index 95107fa..e38cd5d 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -1,7 +1,7 @@ appname = jhmerchant httpport = 12307 #runmode = pro -runmode = prod +runmode = pro HTTPAddr =0.0.0.0 shopAddr = 127.0.0.1:12305 @@ -12,11 +12,10 @@ portalAddr = 127.0.0.1:12400 [logs] # 0 ~ 7, 日志级别 #level =7 -level =7 +level = 0 #日志保存路径 filepath= ./logs/jhmerchant.log #需要显示的日志信息 -#separate="["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"]" separate="["emergency","alert","critical","error","warning","notice","info","debug"]" #日志保存最大天数 maxdays=10 diff --git a/go.mod b/go.mod index 36ad810..fc52469 100644 --- a/go.mod +++ b/go.mod @@ -1,58 +1,82 @@ module merchant -go 1.23.0 +go 1.24.0 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 ( - 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/go-redis/redis v6.14.2+incompatible - github.com/go-sql-driver/mysql v1.8.1 + github.com/go-redis/redis v6.15.9+incompatible + 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/pkg/errors v0.9.1 github.com/rs/xid v1.6.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/tealeg/xlsx v1.0.5 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 ( 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/cenkalti/backoff/v5 v5.0.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // 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/klauspost/compress v1.17.11 // indirect - github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.9 // 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/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/prometheus/client_golang v1.20.5 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.64.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/richardlehane/mscfb 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/tiendc/go-deepcopy v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/xuri/efp v0.0.0-20240408161823-9ad904a10d6d // indirect - github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20221208152030-732eee02a75a // indirect - golang.org/x/net v0.30.0 // indirect + github.com/xuri/efp v0.0.1 // indirect + github.com/xuri/nfp v0.0.1 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel/metric v1.36.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/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/protobuf v1.35.1 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // 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 ) diff --git a/go.sum b/go.sum index 8f57555..2e6f935 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,38 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= 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/beego/beego/v2 v2.3.2-0.20241006064559-d5830a0fc2ee/go.mod h1:5cqHsOHJIxkq44tBpRvtDe59GuVRVv/9/tyVDxd5ce4= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +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/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/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.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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= -github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo= +github.com/dchest/captcha v1.1.0 h1:2kt47EoYUUkaISobUdTbqwx55xvKOJxyScVfw25xzhQ= +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/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/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.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0= -github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= -github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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/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= @@ -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/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 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.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.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +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/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +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.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 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/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= 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.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= +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/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/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.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= 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/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.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= +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/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= 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.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= 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.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4= +github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +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/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= 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/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +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/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= 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/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE= 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/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= 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.0-20240408161823-9ad904a10d6d/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.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE= -github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A= -github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= +github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw= +github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s= +github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q= +github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= 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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= -golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw= -golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= -golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= +golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= +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/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-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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +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-20190423024810-112230192c58/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-20200930185726-fdedc70b468f/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.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 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-20191204190536-9bdfabe68543/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-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 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.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +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 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/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 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.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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/controllers/account_history.go b/internal/controllers/account_history.go index 5d390c8..f634f4e 100644 --- a/internal/controllers/account_history.go +++ b/internal/controllers/account_history.go @@ -62,8 +62,8 @@ func (c *History) HistoryQueryAndListPage() { // 计算分页数 count := account.GetAccountHistoryLenByMap(in) - totalPage := count / limit // 计算总页数 - if count%limit != 0 { // 不满一页的数据按一页计算 + totalPage := count / limit + if count%limit != 0 { totalPage++ } @@ -83,7 +83,7 @@ func (c *History) HistoryQueryAndListPage() { } // 数据回显 - out := make(map[string]interface{}) + out := make(map[string]any) out["limit"] = limit // 分页数据 out["page"] = page out["totalPage"] = totalPage diff --git a/internal/controllers/deal_excel.go b/internal/controllers/deal_excel.go index 9969ba2..1cb2cb4 100644 --- a/internal/controllers/deal_excel.go +++ b/internal/controllers/deal_excel.go @@ -1,27 +1,20 @@ 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 ( + "bytes" "fmt" - "github.com/beego/beego/v2/core/logs" - "github.com/tealeg/xlsx" "merchant/internal/models/merchant" order2 "merchant/internal/models/order" "merchant/internal/models/payfor" + "merchant/internal/otelTrace" "merchant/internal/sys/enum" "merchant/internal/utils" "os" "strings" "time" + + "github.com/beego/beego/v2/core/logs" + "github.com/tealeg/xlsx" ) type DealExcel struct { @@ -40,6 +33,7 @@ func (c *DealExcel) DownloadExcelModel() { // 导出订单记录 func (c *DealExcel) MakeOrderExcel() { + ctx := c.Ctx.Request.Context() us := c.GetSession(enum.UserSession) u := us.(merchant.MerchantInfo) @@ -62,37 +56,33 @@ func (c *DealExcel) MakeOrderExcel() { } var ( - msg = enum.FailedString - 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 + msg = enum.FailedString + flag = enum.FailedFlag ) // 数据获取 - list := order2.GetOrderProfitByMap(in, -1, 0) + list := order2.GetOrderProfitByMap(ctx, in, -1, 0) if len(list) <= 0 { msg = "没有检索到数据!" - goto stopRun + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + _ = c.ServeJSON() + c.StopRun() } // 写入记录 - file = xlsx.NewFile() - sheet, err = file.AddSheet("订单记录") + file := xlsx.NewFile() + sheet, err := file.AddSheet("订单记录") 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 - goto stopRun + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + _ = c.ServeJSON() + c.StopRun() } - // 第一行 - row = sheet.AddRow() + row := sheet.AddRow() row.SetHeightCM(1) - cell = row.AddCell() + cell := row.AddCell() cell.Value = "平台订单号" cell = row.AddCell() cell.Value = "商户订单号" @@ -119,10 +109,8 @@ func (c *DealExcel) MakeOrderExcel() { addCell = addRow.AddCell() addCell.Value = fmt.Sprintf("%f", v.OrderAmount) - var ( - st = "" - t string - ) + var st, t string + switch v.Status { case "failed": st = "交易失败" @@ -143,20 +131,25 @@ func (c *DealExcel) MakeOrderExcel() { addCell.Value = t } - err = file.Save(enum.ExcelDownloadPath + fileName) + // 缓冲数据流到 response + buffer := bytes.NewBuffer(nil) + err = file.Write(buffer) 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 - goto stopRun + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + _ = c.ServeJSON() } - flag = enum.SuccessFlag - msg = fileName + // force download + 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.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") - _ = c.ServeJSON() - c.StopRun() + c.Ctx.Output.Body(buffer.Bytes()) } // 下载excel @@ -170,6 +163,7 @@ func (c *DealExcel) DownloadRecordExcel() { time.Sleep(3 * time.Second) } }() + // 删除临时文件 go func() { tk := time.NewTicker(5 * time.Minute) @@ -226,7 +220,10 @@ func (c *DealExcel) MakeComplaintExcel() { list := order2.GetOrderByMap(in, -1, 0) if len(list) <= 0 { 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 { utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,发生错误:%v", u.MerchantName, err)) 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 { utils.LogError(fmt.Sprintf("商户:%s 导出投诉记录,保存文件发生错误:%v", u.MerchantName, err)) msg = enum.FailedToAdmin - goto stopRun + c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") + c.ServeJSON() + c.StopRun() } flag = enum.SuccessFlag msg = fileName -stopRun: - c.Data["json"] = pubMethod.JsonFormat(flag, "", msg, "") - c.ServeJSON() - c.StopRun() } // 导出提现记录 diff --git a/internal/controllers/index.go b/internal/controllers/index.go index fd1a2d0..b5d654b 100644 --- a/internal/controllers/index.go +++ b/internal/controllers/index.go @@ -2,12 +2,16 @@ package controllers import ( "fmt" + "math" "merchant/internal/models/account" merchant2 "merchant/internal/models/merchant" order2 "merchant/internal/models/order" "merchant/internal/models/road" "merchant/internal/sys/enum" "strconv" + + "github.com/duke-git/lancet/v2/mathutil" + "github.com/duke-git/lancet/v2/slice" ) type Index struct { @@ -19,7 +23,6 @@ func (c *Index) ShowUI() { us := c.GetSession(enum.UserSession) u := us.(merchant2.MerchantInfo) c.Data["userName"] = u.MerchantName - c.TplName = "index.html" } @@ -30,30 +33,26 @@ func (c *Index) LoadUserAccountInfo() { ac := account.GetAccountByUid(u.MerchantUid) - info := make(map[string]interface{}) + info := make(map[string]any) // 账户余额 info["balanceAmt"] = pubMethod.FormatFloat64ToString(ac.Balance) - - // 可用余额 - info["settAmount"] = pubMethod.FormatFloat64ToString(ac.WaitAmount) - - // 冻结金额 - info["freezeAmt"] = pubMethod.FormatFloat64ToString(ac.FreezeAmount) - - // 押款金额 - info["amountFrozen"] = pubMethod.FormatFloat64ToString(ac.LoanAmount) - + // // 可用余额 + // info["settAmount"] = pubMethod.FormatFloat64ToString(ac.WaitAmount) + // // 冻结金额 + // info["freezeAmt"] = pubMethod.FormatFloat64ToString(ac.FreezeAmount) + // // 押款金额 + // info["amountFrozen"] = pubMethod.FormatFloat64ToString(ac.LoanAmount) c.Data["json"] = info - c.ServeJSON() - c.StopRun() + c.ServeJSON(true) } // LoadCountOrder 加载总订单信息 func (c *Index) LoadCountOrder() { + ctx := c.Ctx.Request.Context() us := c.GetSession(enum.UserSession) u := us.(merchant2.MerchantInfo) - md := merchant2.GetMerchantDeployByUid(u.MerchantUid) + md := merchant2.GetMerchantDeployByUid(ctx, u.MerchantUid) type orderInPayWay struct { PayWayName string // 支付方式名 @@ -68,7 +67,7 @@ func (c *Index) LoadCountOrder() { in := make(map[string]string) 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 ways[k].OrderCount = order2.GetOrderLenByMap(in) @@ -90,12 +89,13 @@ func (c *Index) LoadCountOrder() { // LoadOrderCount 加载总订单数 func (c *Index) LoadOrderCount() { + ctx := c.Ctx.Request.Context() + us := c.GetSession(enum.UserSession) u := us.(merchant2.MerchantInfo) - - out := make(map[string]interface{}) - in := make(map[string]string) + out := make(map[string]any) + in["merchant_uid"] = u.MerchantUid out["orders"] = order2.GetOrderLenByMap(in) @@ -108,7 +108,7 @@ func (c *Index) LoadOrderCount() { agentAll := 0.0 allAmount := 0.0 TadaySuccessNum := 0 - datainfo := order2.GetOrderProfitByMap(in, -1, 0) + datainfo := order2.GetOrderProfitByMap(ctx, in, -1, 0) for _, v := range datainfo { if v.Status != "success" { @@ -121,25 +121,23 @@ func (c *Index) LoadOrderCount() { TadaySuccessNum += 1 } - out["TadaySupplierProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", supplierAll), 3) - out["TadayPlatformProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", platformAll), 3) - out["TadayAgentProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", agentAll), 3) - out["TadayAllAmount"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", allAmount), 3) + out["TadaySupplierProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", supplierAll), 64) + out["TadayPlatformProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", platformAll), 64) + out["TadayAgentProfit"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", agentAll), 64) + out["TadayAllAmount"], _ = strconv.ParseFloat(fmt.Sprintf("%.3f", allAmount), 64) out["TadaySuccessNum"] = TadaySuccessNum out["TadayAllNum"] = len(datainfo) - } if out["orders"].(int) == 0 { out["suc_rate"] = 0 } 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.ServeJSON() - c.StopRun() } // LoadUserPayWayUI 加载用户支付配置 @@ -152,26 +150,138 @@ func (c *Index) LoadUserPayWayUI() { } func (c *Index) LoadUserPayWay() { + ctx := c.Ctx.Request.Context() 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 { - No string // 通道编号 - Name string // 产品名 - Rate float64 // 通道费率 + No string `json:"no"` // 通道编号 + Name string `json:"name"` // 产品名 + 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)) - - for k, v := range md { - road_ := road.GetRoadInfoByRoadUid(v.SingleRoadUid) - ways[k].No = road_.RoadUid - ways[k].Name = road_.RoadName + type TotalSummary struct { + 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"` // 总成功订单金额 } - 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.StopRun() } diff --git a/internal/controllers/keep_session.go b/internal/controllers/keep_session.go index 4b2ecfc..f40f893 100644 --- a/internal/controllers/keep_session.go +++ b/internal/controllers/keep_session.go @@ -34,7 +34,6 @@ func (c *KeepSession) Prepare() { } _, b := c.Ctx.GetSecureCookie(uc.(string), enum.UserCookie) - //utils.LogNotice(fmt.Sprintf("客户端cookie:%s,服务端cookie:%s", cookie, uc.(string))) if !b { c.DelSession(enum.UserSession) c.Ctx.Redirect(302, "/") diff --git a/internal/controllers/trade_record.go b/internal/controllers/trade_record.go index 5b62dda..7ab8083 100644 --- a/internal/controllers/trade_record.go +++ b/internal/controllers/trade_record.go @@ -1,10 +1,8 @@ package controllers import ( - "merchant/internal/models/account" "merchant/internal/models/merchant" order2 "merchant/internal/models/order" - "merchant/internal/service" "merchant/internal/sys/enum" "strconv" "strings" @@ -105,16 +103,16 @@ func (c *TradeRecord) TradeQueryAndListPage() { } // 数据回显 - out := make(map[string]interface{}) + out := make(map[string]any) out["limit"] = limit // 分页数据 out["page"] = page out["totalPage"] = totalPage out["root"] = res // 显示数据 - out["profitSummary"] = account.ProfitSummary{ - TotalProfit: service.QueryTotalSummary(in), - TodayProfit: service.QueryTodaySummary(in), - } + // out["profitSummary"] = account.ProfitSummary{ + // TotalProfit: service.QueryTotalSummary(in), + // TodayProfit: service.QueryTodaySummary(in), + // } c.Data["json"] = out diff --git a/internal/controllers/user_info.go b/internal/controllers/user_info.go index 79cc212..bceaa6c 100644 --- a/internal/controllers/user_info.go +++ b/internal/controllers/user_info.go @@ -225,6 +225,7 @@ func (c *UserInfo) ResetTotp() { } func (c *UserInfo) QueryAllowedRoad() { + ctx := c.Ctx.Request.Context() us := c.GetSession(enum.UserSession) u := us.(merchant.MerchantInfo) if u.Id == 0 { @@ -235,7 +236,7 @@ func (c *UserInfo) QueryAllowedRoad() { _ = c.ServeJSON() return } - result := service.QueryAllowedRoad(u.MerchantUid) + result := service.QueryAllowedRoad(ctx, u.MerchantUid) c.Data["json"] = response.CommonResWithData{ CommonRes: response.CommonRes{ Msg: "成功", @@ -248,6 +249,7 @@ func (c *UserInfo) QueryAllowedRoad() { // QueryAllowedMM 获取允许的面值 func (c *UserInfo) QueryAllowedMM() { + ctx := c.Ctx.Request.Context() roadCode := c.GetString("roadCode") if roadCode == "" { c.Data["json"] = response.CommonRes{ @@ -276,7 +278,7 @@ func (c *UserInfo) QueryAllowedMM() { _ = c.ServeJSON() return } - result := service.QueryAllowedDeployInfoMM(u.MerchantUid, roadPool.RoadUid) + result := service.QueryAllowedDeployInfoMM(ctx, u.MerchantUid, roadPool.RoadUid) returnList := make([]struct { ShowLabel float64 `json:"showLabel"` }, 0) diff --git a/internal/models/account/account.go b/internal/models/account/account.go index a20737c..8c29cce 100644 --- a/internal/models/account/account.go +++ b/internal/models/account/account.go @@ -40,7 +40,6 @@ func GetAccountByUid(accountUid string) AccountInfo { if err != nil { logs.Error("get account by uid fail: ", err) } - return account } diff --git a/internal/models/merchant/deploy_info.go b/internal/models/merchant/deploy_info.go index 4ad1541..36cf348 100644 --- a/internal/models/merchant/deploy_info.go +++ b/internal/models/merchant/deploy_info.go @@ -1,19 +1,13 @@ 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 ( + "context" "encoding/json" "fmt" + "merchant/internal/otelTrace" + "github.com/beego/beego/v2/client/orm" + "go.uber.org/zap" "github.com/beego/beego/v2/core/logs" ) @@ -41,6 +35,14 @@ type MerchantDeployInfo struct { 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) { myMap := make(map[int]float64) @@ -96,9 +98,9 @@ func GetMerchantDeployByUidAndPayType(uid, payType string) MerchantDeployInfo { return merchantDeployInfo } -func GetMerchantDeployByUid(uid string) (ms []MerchantDeployInfo) { +func GetMerchantDeployByUid(ctx context.Context, uid string) (ms []MerchantDeployInfo) { 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 { logs.Error("get merchant deploy by uid fail:", err) } diff --git a/internal/models/merchant/info.go b/internal/models/merchant/info.go index e4d0c9e..19db1ba 100644 --- a/internal/models/merchant/info.go +++ b/internal/models/merchant/info.go @@ -1,16 +1,8 @@ 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 ( + "context" + "github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/core/logs" ) @@ -41,30 +33,33 @@ type MerchantInfo struct { } type ProfitMargin struct { - FactLabel float64 `json:"factLabel"` - ShowLabel float64 `json:"showLabel"` - LinkID string `json:"linkID"` + Sort int `json:"sort" orm:"sort,omitempty"` + ShowLabel float64 `json:"showLabel" orm:"show_label,omitempty"` + 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" -func IsExistByMerchantName(merchantName string) bool { +func IsExistByMerchantName(ctx context.Context, merchantName string) bool { 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 } -func IsExistByMerchantUid(uid string) bool { +func IsExistMerchantByAgentUid(ctx context.Context, uid string) bool { o := orm.NewOrm() - exist := o.QueryTable(MERCHANT_INFO).Filter("merchant_uid", uid).Exist() - - return exist -} - -func IsExistMerchantByAgentUid(uid string) bool { - o := orm.NewOrm() - exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).Exist() + exist := o.QueryTable(MERCHANT_INFO).Filter("belong_agent_uid", uid).ExistWithCtx(ctx) return exist } diff --git a/internal/models/merchant/load_info.go b/internal/models/merchant/load_info.go index 9e669aa..9572eee 100644 --- a/internal/models/merchant/load_info.go +++ b/internal/models/merchant/load_info.go @@ -1,15 +1,5 @@ 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 ( "github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/core/logs" diff --git a/internal/models/order/profit_info.go b/internal/models/order/profit_info.go index 7fa0160..f2bb0a5 100644 --- a/internal/models/order/profit_info.go +++ b/internal/models/order/profit_info.go @@ -1,10 +1,13 @@ package order import ( + "context" + "merchant/internal/models/account" + "merchant/internal/otelTrace" + "strings" + "github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/core/logs" - "merchant/internal/models/account" - "strings" ) type OrderProfitInfo struct { @@ -93,7 +96,7 @@ func GetOrderProfitLenByMap(params map[string]string) int { 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() var orderProfitInfoList []OrderProfitInfo 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) } } - _, err := qs.Limit(display, offset).OrderBy("-create_time").All(&orderProfitInfoList) + _, err := qs.Limit(display, offset).OrderBy("-create_time").AllWithCtx(ctx, &orderProfitInfoList) if err != nil { - logs.Error("get order by map fail: ", err) + otelTrace.Logger.WithContext(ctx).Error("查询失败") } return orderProfitInfoList } diff --git a/internal/models/order/summary.go b/internal/models/order/summary.go index ffb3aa1..763c63d 100644 --- a/internal/models/order/summary.go +++ b/internal/models/order/summary.go @@ -1,13 +1,66 @@ package order +import ( + "context" + "time" + + "github.com/beego/beego/v2/client/orm" + "github.com/duke-git/lancet/v2/slice" +) + // Summary 订单总结 type Summary struct { - TotalNum int `json:"totalNum"` // 提交订单数 - TotalAmount float64 `json:"totalAmount"` // 订单总金额 - PaidNum int `json:"paidNum"` // 已付订单数 - PaidAmount float64 `json:"paidAmount"` // 已付总金额 - PlatformIncome float64 `json:"platformIncome"` // 平台收入 - MerchantIncome float64 `json:"merchantIncome"` // 商户收入 - AgencyIncome float64 `json:"agencyIncome"` // 代理收入 - ChannelCost float64 `json:"channelCost"` // 通道成本 + TotalNum int `json:"totalNum"` // 提交订单数 + TotalAmount float64 `json:"totalAmount"` // 订单总金额 + Rate float64 `json:"rate"` // 成功率 + SuccessNum int `json:"successNum"` // 成功订单数 + SuccessAmount float64 `json:"successAmount"` // 成功订单总金额 + Date time.Time `json:"date"` // 日期 +} + +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 } diff --git a/internal/models/road/road_info.go b/internal/models/road/road_info.go index 064ce89..7b68794 100644 --- a/internal/models/road/road_info.go +++ b/internal/models/road/road_info.go @@ -1,38 +1,50 @@ package road import ( + "context" + "merchant/internal/otelTrace" + "time" + "github.com/beego/beego/v2/client/orm" "github.com/beego/beego/v2/core/logs" + "go.uber.org/zap" ) type RoadInfo struct { - Id int - Status string - RoadName string - RoadUid string - Remark string - ProductName string - ProductUid string - PayType string - BasicFee float64 - SettleFee float64 - TotalLimit float64 - TodayLimit float64 - SingleMinLimit float64 - SingleMaxLimit float64 - StarHour int - EndHour int - Params string - TodayIncome float64 - TotalIncome float64 - TodayProfit float64 - TotalProfit float64 - Balance float64 - RequestAll int - RequestSuccess int - UpdateTime string - CreateTime string - ProductCode string + Id int + Status string + RoadName string + RoadUid string + Remark string + ProductName string + ProductUid string + PayType string + BasicFee float64 + SettleFee float64 + TotalLimit float64 + TodayLimit float64 + SingleMinLimit float64 + SingleMaxLimit float64 + StarHour int + EndHour int + Params string + TodayIncome float64 + TotalIncome float64 + TodayProfit float64 + TotalProfit float64 + Balance float64 + RequestAll int + RequestSuccess int + TodayRequestAll int `json:"TodayRequestAll"` + TodayRequestSuccess int + IsAllowDifferentResend int + TransactionType string + PaymentHtml string + + ProductCode string + + CreateTime time.Time + UpdateTime time.Time } type SimpleRoadInfo struct { @@ -42,12 +54,12 @@ type SimpleRoadInfo struct { const ROAD_INFO = "road_info" -func GetRoadInfoByRoadUid(roadUid string) RoadInfo { +func GetRoadInfoByRoadUid(ctx context.Context, roadUid string) RoadInfo { o := orm.NewOrm() var roadInfo RoadInfo _, err := o.QueryTable(ROAD_INFO).Exclude("status", "delete").Filter("road_uid", roadUid).Limit(1).All(&roadInfo) 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 } diff --git a/internal/otelTrace/init.go b/internal/otelTrace/init.go new file mode 100644 index 0000000..854dcfb --- /dev/null +++ b/internal/otelTrace/init.go @@ -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, + } +} diff --git a/internal/service/deploy_info.go b/internal/service/deploy_info.go index 95e252b..23f0604 100644 --- a/internal/service/deploy_info.go +++ b/internal/service/deploy_info.go @@ -1,15 +1,16 @@ package service import ( + "context" "encoding/json" "merchant/internal/models/merchant" "merchant/internal/models/road" ) // QueryAllowedDeployInfoMM 获取指定商户的允许面额信息 -func QueryAllowedDeployInfoMM(merchantUid, roadUid string) []merchant.ProfitMargin { +func QueryAllowedDeployInfoMM(ctx context.Context, merchantUid, roadUid string) []merchant.ProfitMargin { resInfo := make([]merchant.ProfitMargin, 0) - merchantInfoList := merchant.GetMerchantDeployByUid(merchantUid) + merchantInfoList := merchant.GetMerchantDeployByUid(ctx, merchantUid) if len(merchantInfoList) == 0 { return resInfo } @@ -25,9 +26,9 @@ func QueryAllowedDeployInfoMM(merchantUid, roadUid string) []merchant.ProfitMarg } // QueryAllowedRoad 获取商户允许通道信息 -func QueryAllowedRoad(merchantUid string) []road.SimpleRoadInfo { +func QueryAllowedRoad(ctx context.Context, merchantUid string) []road.SimpleRoadInfo { var resInfo []road.SimpleRoadInfo - merchantInfoList := merchant.GetMerchantDeployByUid(merchantUid) + merchantInfoList := merchant.GetMerchantDeployByUid(ctx, merchantUid) if len(merchantInfoList) == 0 { return resInfo } diff --git a/static/code/demo.zip b/static/code/demo.zip deleted file mode 100644 index 7e1f44e00b69fc9bc07534f99f90d2aff13ef0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2089 zcmZ{lc{J2}AIE>P6d6mD(A-kD8XhBS4Z<`g)0h@CE;nhyOw(X63yqp2g{y28TI|c% z3JKTNMJ6M=!6;-IAro~mgG?q5=XvgO&U2sd_k7OhobP$RzUO@Yc)vdm7-<=G006cC zb1!XOyQ+3x9FPWp(JcU=xc*8BBv6BK9swkSfZ!r$oR2n2<%Y(zrT)-E%dC{|ZTI2f z-Oc?hWil?>{HH7b66g)5&wgpy!BM$9Q{^zks)|YOC(SrP)KlOX(CIxm&Ox^`5{1;? ztk4IKqaXAn!bm}vf~Ka9)c@QJVjggan;U5$5lv$6+wkj-sNMe18@X_B-E1}0{)veBKpPt|=}74wPS!rzHFyK9@@HrE$iuL!=r`hl_bG+9_SJ*FLa z>4BrFvA;PMzLR3^oeAFG+!`7^!rJ#9S*6_OEdo3GSo&4Y2)*lZ&$VPzFpq_4^%ZsB zjWlnoGw*~W&S@HsDnaLC{W1HC-|F!SgvDZygw1u$x<490OSvor2Hc~z_wtmm$%zXo z(PViKKoUQ7cov+$JW-46h8nltY6Ck976Vf-7oM>~`W(fkY5K4ApXpq)>-`Y_?m$?m zu(Q}2#r0H2JhCp+?G@#OcJJC@wm&+4$vY*H?*@q(}OHdn53)??B{M`1) zSOK-Iq71_Eqfh|0edYy!bqe!nIZ?#$4=+9bNK$vG12gGV#D#3v3io8ahxGZxe0sk; z?HPV3JIUtu{ScS}wl`8+XGd^=a!!pKit>&`zN|Yfqre$Yk z*xCNVkVCGRss=`^hXtrh<1|sEs{Q7}g^^mHl^mr}o0{MSl8F6aS~Q~l!Z4`*sNB-B zU^>P%uZAQ|%bVe!nl3b0JgIxx-eh0f-3dje5?E}JGO=TR4|)Jr6z;_f;3dHx?HzVH z+`)>{RCbKtcGw=HhI~V{c$Z=Dtsd2Nrr2Pa6Ny7TM9B-75n^*wnHPJM&ZZ8cW!S2H zlUng|dIMT2m1MQ@VdRi@c!#cFl4`MK>^QrxA0bzHF5kw5E0tIB0$DlXcG>p2zzQB| z{%m{xmHEb<7(Y0>;^|=Da7LQ!8y}c@>QLabX2s{J1{ryRwzs`K=iSWkQ{|0ju1S{9 zMv7{kOD5(ksI}W7_~YU5urZwFav<^D8n1kfZ%5HByZTyfrOKh?<=LdcpS#KT)V0J- zrdH!ly+|mWXX-xA$c;)Sb;&{+gu5O7i~vrot*bbzI(=jl0EEi|0O-#M2=E{h)-xaw z+ve8`S06^T+PJc_em#+TCD~443&JHoREA(lHGY8q1=k);l16ymlDTUwGg%7g>6K@cTdX8$1rO|zd^NA)}M_tP6)0ZMqIF5gp-Oy-b zb<%!FglR=Y#8oHpBD2m_@5v;g3=2(WITc;dPu$8|MY^e8ypgmI_^!VT)fh=+4;SI( z1sMG>!k%XX<1 zfI7>7n;f!5X!*WUQSn8cRw%kfdKw&R=<=yB=Hy~ejOOMOz=}kNS^WIoY+u_wvlAKYnj{sYNe&Xf|7m3 z#?B3O?+)2W15=}W3@v+V8?5e;ThLtvMfc3p_tWO0bG`_rgoWuy%GMozpdYvE+Ml+) zIji6AkN_mOXU5MOy+T&^dG;*5FZP$`FT?2jXq%)^THygp_^^mZY$2wtA`$U*`|%|1T9oYZzcEQ!-af+9~Ag{Mn2z(+nQ`8QS;%q7q3PT0VW zKa2nXR2hWpF&(<$fpr6Hl*)Qh36ww*l|Ux=(P;*B20b9yiy9n2_s9E_2_aS{21aHE zh9HFv6@f;lg;*IIm>3xtI$)$WsRRFi!>)e}NCA5`+WPtXzWqD-PsZHP|A&;8`Gfqg hP5(mwd6d6U#m)aam;**uZbKoxe#_ST#dQq;{2K+x$+Z9g diff --git a/static/js/deal_excel.js b/static/js/deal_excel.js index 929d051..effa5e3 100644 --- a/static/js/deal_excel.js +++ b/static/js/deal_excel.js @@ -1,11 +1,123 @@ -/*************************************************** - ** @Desc : This file for 导出Excel文件 - ** @Time : 19.12.7 16:48 - ** @Author : Joker - ** @File : deal_excel - ** @Last Modified by : Joker - ** @Last Modified time: 19.12.7 16:48 - ** @Software: GoLand - ****************************************************/ - -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.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.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.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.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)}})}}; \ No newline at end of file +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, + }, + 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.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.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.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) + } + }) + } +}; \ No newline at end of file diff --git a/static/js/form_validate.js b/static/js/form_validate.js index d12b130..126d8b4 100644 --- a/static/js/form_validate.js +++ b/static/js/form_validate.js @@ -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 = { modify_userInfo: function () { let or_pwd = $("#or_pwd").val(); diff --git a/static/js/index.js b/static/js/index.js index b24a649..2b14091 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -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 = { - getAccountInfo: function() { + getAccountInfo: function () { $.ajax({ type: "GET", url: "/index/loadInfo/", - success: function(result) { + success: function (result) { $("#balanceAmt").text(result["balanceAmt"]); $("#settAmount").text(result["settAmount"]); $("#freezeAmt").text(result["freezeAmt"]); $("#amountFrozen").text(result["amountFrozen"]) }, - error: function(XMLHttpRequest) { + error: function (XMLHttpRequest) { toastr.info('something is wrong, code: ' + XMLHttpRequest.status) } }) }, - getOrdersInfo: function() { + getOrdersInfo: function () { $.ajax({ type: "GET", url: "/index/loadOrders", - success: function(result) { + success: function (result) { $("#orders").text(result["orders"]); $("#suc_orders").text(result["suc_orders"]); $("#suc_rate").text((result["suc_rate"] * 100).toFixed(2) + "%") }, - error: function(XMLHttpRequest) { + error: function (XMLHttpRequest) { toastr.info('something is wrong, code: ' + XMLHttpRequest.status) } }) }, - get_account_balance: function() { + get_account_balance: function () { $.ajax({ type: "GET", url: "/withdraw/balance", - success: function(resp) { + success: function (resp) { $("#balance").val(resp.balance); $("#sett_fee").html(resp.fee) }, - error: function(XMLHttpRequest) { + error: function (XMLHttpRequest) { toastr.info('something is wrong, code: ' + XMLHttpRequest.status) } }) }, - loadTradeRecord: function() { + loadTradeRecord: function () { $.ajax({ type: "GET", url: "/index/load_count_order", - success: function(res) { + success: function (res) { let con = ""; - $.each(res, function(index, item) { + $.each(res, function (index, item) { if (item.PayWayName === "") { return true } - con += `
` + (index + 1) + `
` + item.PayWayName + `
` + item.OrderCount + `
` + item.SucOrderCount + `
` + (item.SucRate * 100).toFixed(2) + `%
` + con += `
` + (index + 1) + `
` + item.PayWayName + `
` + item.OrderCount + `
` + item.SucOrderCount + `
` + (item.SucRate * 100).toFixed(2) + `%
` }); $("#your_showtime").html(con) }, - error: function(XMLHttpRequest) { + error: function (XMLHttpRequest) { toastr.info('something is wrong, code: ' + XMLHttpRequest.status) } }) }, - loadPayWay: function() { + loadPayWay: function () { $.ajax({ type: "GET", url: "/index/pay_way", - success: function(res) { + success: function (res) { let con = ""; - $.each(res, function(index, item) { - if (item.Name === "") { + $.each(res.ways, function (index, item) { + if (item.name === "") { return true } - con += `
` + (index + 1) + `
` + item.Name + `
` + item.Rate + `%
` + con += `
+
+
+ ` + + (index + 1) + + `
` + + item.name + + `
` + + item.rate + + `
` + + item.todayAmount + + `
` + + item.todaySucRate + + `
` + + item.yesterdayAmount + + `
` + + item.yesterdaySucRate + + `
` + + item.totalAmount + + `
` + + item.totalSucRate + + `% +
+
+
` }); $("#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) } }) diff --git a/static/js/trade_record.js b/static/js/trade_record.js index da4fb31..4bd62bb 100644 --- a/static/js/trade_record.js +++ b/static/js/trade_record.js @@ -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 = { get_last_month_date: function () { let date = new Date(); @@ -68,7 +58,8 @@ let trade = { ss = "0" + ss } return strYear + "-" + strMonth + "-" + strDay + " " + hh + ":" + mm + ":" + ss - }, trade_do_paging: function () { + }, + trade_do_paging: function () { let merchantNo = $("#merchant_No").val(); let startTime = $("#startTime").val(); let endTime = $("#endTime").val(); @@ -98,15 +89,15 @@ let trade = { numberOfPages: data.limit, itemTexts: function (type, page) { switch (type) { - case"first": + case "first": return "首页"; - case"prev": + case "prev": return "上一页"; - case"next": + case "next": return "下一页"; - case"last": + case "last": return "末页"; - case"page": + case "page": return page } }, @@ -139,15 +130,18 @@ let trade = { $.each(list, function (index, item) { let bg_red = "", st = "", t = ""; switch (item.Status) { - case"failed": + case "failed": case "fail": st = "交易失败"; bg_red = ` style="color: red"`; break; - case"wait": + case "created": + st = "创建订单"; + break; + case "wait": st = "等待支付"; break; - case"success": + case "success": bg_red = ` style="color: green"`; st = "交易成功"; t = item.UpdateTime; @@ -215,15 +209,15 @@ let trade = { numberOfPages: data.limit, itemTexts: function (type, page) { switch (type) { - case"first": + case "first": return "首页"; - case"prev": + case "prev": return "上一页"; - case"next": + case "next": return "下一页"; - case"last": + case "last": return "末页"; - case"page": + case "page": return page } }, @@ -256,10 +250,10 @@ let trade = { $.each(list, function (index, item) { let st = ""; switch (item.FreezeOrder) { - case"yes": + case "yes": st = "已冻结"; break; - case"no": + case "no": st = "已退款"; break } diff --git a/static/js/withdraw_account_list.js b/static/js/withdraw_account_list.js index 94cc193..fbf6e14 100644 --- a/static/js/withdraw_account_list.js +++ b/static/js/withdraw_account_list.js @@ -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 = { withdraw_do_paging: function () { let bankNo = $("#bankNo").val(); diff --git a/views/complaint_record.html b/views/complaint_record.html index 0b72340..ee4c169 100644 --- a/views/complaint_record.html +++ b/views/complaint_record.html @@ -44,7 +44,7 @@ class="icon icon-presentation">订单管理
  • diff --git a/views/gen_link.html b/views/gen_link.html index db33121..2932ae9 100644 --- a/views/gen_link.html +++ b/views/gen_link.html @@ -44,7 +44,7 @@ class="icon icon-presentation" style="color: black;">订单管理
  • diff --git a/views/index.html b/views/index.html index 2ef01af..ec76500 100644 --- a/views/index.html +++ b/views/index.html @@ -2,8 +2,9 @@ - {{template "template/css.html"}} - + + +{{template "template/css.html"}} @@ -44,7 +45,7 @@ class="icon icon-presentation" style="color: black;">订单管理
  • diff --git a/views/pay_way.html b/views/pay_way.html index 25cd623..586cfb7 100644 --- a/views/pay_way.html +++ b/views/pay_way.html @@ -44,7 +44,7 @@ class="icon icon-presentation">订单管理
  • diff --git a/views/show_userInfo.html b/views/show_userInfo.html index f52d50d..d2f8639 100644 --- a/views/show_userInfo.html +++ b/views/show_userInfo.html @@ -44,8 +44,7 @@ class="icon icon-presentation">订单管理
  • diff --git a/views/withdraw/withdraw.html b/views/withdraw/withdraw.html index 7bf6cee..04cc125 100644 --- a/views/withdraw/withdraw.html +++ b/views/withdraw/withdraw.html @@ -44,7 +44,7 @@ class="icon icon-presentation">订单管理 diff --git a/views/withdraw/withdraw_record.html b/views/withdraw/withdraw_record.html index b8f6bfe..d4a91d3 100644 --- a/views/withdraw/withdraw_record.html +++ b/views/withdraw/withdraw_record.html @@ -44,7 +44,7 @@ class="icon icon-presentation">订单管理