zoie hace 11 meses
commit
707d07306c
Se han modificado 100 ficheros con 9400 adiciones y 0 borrados
  1. 43 0
      .gitignore
  2. 74 0
      Makefile
  3. 123 0
      README.md
  4. 53 0
      cmd/cclogisticserver/main.go
  5. 105 0
      configs/test.yaml
  6. 98 0
      doc/develop/framework.md
  7. 78 0
      doc/develop/standards.md
  8. 154 0
      go.mod
  9. 1130 0
      go.sum
  10. 38 0
      internal/pkg/common/codex/code_gen.go
  11. 31 0
      internal/pkg/common/codex/code_gen.md
  12. 20 0
      internal/pkg/common/codex/codes.go
  13. 8 0
      internal/pkg/common/codex/codes_biz.go
  14. 55 0
      internal/pkg/common/codex/codes_common.go
  15. 39 0
      internal/pkg/common/constant/base.go
  16. 86 0
      internal/pkg/common/constant/constant.go
  17. 14 0
      internal/pkg/common/constant/dict.go
  18. 96 0
      internal/pkg/common/constant/enums.go
  19. 67 0
      internal/pkg/common/global/connect.go
  20. 18 0
      internal/pkg/common/global/ctx_trace.go
  21. 86 0
      internal/pkg/common/global/struct.go
  22. 37 0
      internal/pkg/common/global/token.go
  23. 48 0
      internal/pkg/common/options/baseOptions.go
  24. 9 0
      internal/pkg/common/options/bzd.go
  25. 22 0
      internal/pkg/common/options/nats.go
  26. 7 0
      internal/pkg/common/options/wechat.go
  27. 5 0
      internal/pkg/doc.go
  28. 18 0
      internal/pkg/utils/contextutil/ctx_trace.go
  29. 64 0
      internal/pkg/utils/excelizeutil/excel.go
  30. 212 0
      internal/pkg/utils/excelutil/create.go
  31. 32 0
      internal/pkg/utils/excelutil/create_test.go
  32. 194 0
      internal/pkg/utils/excelutil/style.go
  33. 165 0
      internal/pkg/utils/excelutil/writer.go
  34. 35 0
      internal/pkg/utils/headutil/auth.go
  35. 135 0
      internal/pkg/utils/signutil/ibingli_digest.go
  36. 183 0
      internal/pkg/utils/signutil/ibingli_digest_test.go
  37. 40 0
      internal/pkg/utils/sqlutil/sql.go
  38. 44 0
      internal/pkg/utils/stringutil/path.go
  39. 89 0
      internal/pkg/utils/stringutil/pinyin.go
  40. 42 0
      internal/pkg/utils/stringutil/pinyin_test.go
  41. 74 0
      internal/pkg/utils/timeutil/time.go
  42. 15 0
      internal/pkg/utils/timeutil/time_test.go
  43. 50 0
      internal/server/adapter/adapter.go
  44. 43 0
      internal/server/adapter/http/middleware/account_type.go
  45. 129 0
      internal/server/adapter/http/middleware/auth.go
  46. 161 0
      internal/server/adapter/http/middleware/manage_auth.go
  47. 165 0
      internal/server/adapter/http/v1/auth/auth.go
  48. 78 0
      internal/server/adapter/http/v1/common/api.go
  49. 30 0
      internal/server/adapter/http/v1/insider/api.go
  50. 106 0
      internal/server/adapter/http/v1/insider/driver.go
  51. 79 0
      internal/server/adapter/http/v1/insider/house.go
  52. 53 0
      internal/server/adapter/http/v1/manage/api.go
  53. 90 0
      internal/server/adapter/http/v1/manage/car.go
  54. 71 0
      internal/server/adapter/http/v1/manage/common.go
  55. 75 0
      internal/server/adapter/http/v1/manage/order.go
  56. 43 0
      internal/server/adapter/http/v1/manage/statistic.go
  57. 85 0
      internal/server/adapter/http/v1/manage/warehouse.go
  58. 95 0
      internal/server/adapter/http/v1/myself/address.go
  59. 37 0
      internal/server/adapter/http/v1/myself/api.go
  60. 69 0
      internal/server/adapter/http/v1/myself/logistic.go
  61. 81 0
      internal/server/adapter/http/v1/myself/order.go
  62. 52 0
      internal/server/adapter/http/v1/myself/self.go
  63. 23 0
      internal/server/adapter/http/v1/public/api.go
  64. 96 0
      internal/server/adapter/http/v1/public/public.go
  65. 35 0
      internal/server/adapter/job/ordercron/order_no_job.go
  66. 125 0
      internal/server/application/authsrv/service.go
  67. 38 0
      internal/server/application/authsrv/vo.go
  68. 166 0
      internal/server/application/carsrv/service.go
  69. 67 0
      internal/server/application/carsrv/vo.go
  70. 110 0
      internal/server/application/commonsrv/service.go
  71. 28 0
      internal/server/application/commonsrv/vo.go
  72. 51 0
      internal/server/application/devicesrv/service.go
  73. 37 0
      internal/server/application/devicesrv/vo.go
  74. 308 0
      internal/server/application/driversrv/service.go
  75. 60 0
      internal/server/application/driversrv/vo.go
  76. 98 0
      internal/server/application/myselfsrv/account_service.go
  77. 102 0
      internal/server/application/myselfsrv/address_service.go
  78. 69 0
      internal/server/application/myselfsrv/logistic_service.go
  79. 55 0
      internal/server/application/myselfsrv/order_service.go
  80. 148 0
      internal/server/application/myselfsrv/vo.go
  81. 143 0
      internal/server/application/ordersrv/query_service.go
  82. 209 0
      internal/server/application/ordersrv/service.go
  83. 192 0
      internal/server/application/ordersrv/vo.go
  84. 53 0
      internal/server/application/statisticsrv/service.go
  85. 46 0
      internal/server/application/statisticsrv/vo.go
  86. 189 0
      internal/server/application/warehousesrv/house_service.go
  87. 166 0
      internal/server/application/warehousesrv/manage_service.go
  88. 11 0
      internal/server/application/warehousesrv/service.go
  89. 108 0
      internal/server/application/warehousesrv/vo.go
  90. 1 0
      internal/server/domain/domainevent/event.go
  91. 208 0
      internal/server/domain/domainservice/account.go
  92. 37 0
      internal/server/domain/domainservice/address_book.go
  93. 91 0
      internal/server/domain/domainservice/cos_temp_key.go
  94. 112 0
      internal/server/domain/domainservice/order_no.go
  95. 36 0
      internal/server/domain/domainservice/order_no_test.go
  96. 53 0
      internal/server/domain/domainservice/validate.go
  97. 229 0
      internal/server/infra/dao/a_baseStore.go
  98. 113 0
      internal/server/infra/dao/a_dataStore.go
  99. 130 0
      internal/server/infra/dao/account.go
  100. 179 0
      internal/server/infra/dao/address_book.go

+ 43 - 0
.gitignore

@@ -0,0 +1,43 @@
+### Backup ###
+*.bak
+*.tmp
+tmp/
+
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+# vendor/
+.idea
+.vscode
+configs/local_test.yaml
+configs/demonstration_local.yaml
+pb/
+doc/docs.go
+doc/swagger.json
+doc/swagger.yaml
+
+
+# log
+*.log
+
+# env
+*.env
+
+# output
+output/
+
+# golang
+go.work
+
+cmd/cclogisticserver/cclogistic_6270

+ 74 - 0
Makefile

@@ -0,0 +1,74 @@
+BUILD_TIME=$(shell date "+%FZ%T")
+COMMIT_SHA1=$(shell git rev-parse HEAD)
+ct=$(shell git log -1 --format="%ct")
+COMMIT_TIME= $(shell date -d "1970-01-01 UTC $(ct) seconds" "+%FZ%T")
+GIT_TAG=$(shell git describe --exact-match HEAD 2> /dev/null)
+GIT_BRANCH:=$(if $(BRANCH_NAME),$(BRANCH_NAME),$(shell git rev-parse --abbrev-ref HEAD))
+VERSION_PACKAGE=gitee.com/hexingqq/go-backend/pkg/contrib/version
+flags="-X $(VERSION_PACKAGE).BuildTime=${BUILD_TIME} -X $(VERSION_PACKAGE).CommitTime=${COMMIT_TIME} -X $(VERSION_PACKAGE).CommitID=${COMMIT_SHA1} -X $(VERSION_PACKAGE).GitTag=${GIT_TAG} -X $(VERSION_PACKAGE).GitBranch=${GIT_BRANCH}"
+
+GOCMD=go
+GOBUILD=$(GOCMD) build
+GOCLEAN=$(GOCMD) clean
+GOTEST=$(GOCMD) test
+GOGET=$(GOCMD) get
+GOGENERATE=$(GOCMD) generate
+GOVET=$(GOCMD) vet
+OS_TYPE=$(shell go env GOOS)
+BINARY_NAME := $(PROJECT_NAME)
+
+ifeq ($(OS_TYPE),windows)
+	GO_OUT_EXT := .exe
+endif
+
+
+all: build_server
+
+.PHONY: build
+build:
+	$(GOBUILD) --ldflags ${flags} -o ./cmd/$(PROJECT_NAME)/$(BINARY_NAME)$(GO_OUT_EXT) -v ./cmd/$(PROJECT_NAME)/main.go
+
+.PHONY: test
+test:generate
+	$(GOTEST) -v ./...
+
+.PHONY: clean
+clean:
+	$(GOCLEAN)
+	rm -f ./cmd/$(BINARY_NAME)
+	rm -f ./cmd/$(BINARY_NAME)
+
+.PHONY: changelog
+changelog:
+	git tag -ln --sort=taggerdate > ./CHANGELOG
+
+.PHONY: generate
+generate:
+	$(GOGENERATE) -x ./...
+
+.PHONY: vet
+vet:
+	$(GOVET) ./...
+
+fmt:
+	# go install mvdan.cc/gofumpt@latest
+	gofumpt -l -w -extra .
+
+.PHONY: swagger
+swagger:
+	swag fmt
+	swag init -g ./cmd/$(PROJECT_NAME)/main.go -o ./doc  --parseDependency true
+
+# Cross compilation
+.PHONY: build-linux
+build-linux:
+	GOOS=linux GOARCH=amd64 $(GOBUILD) --ldflags ${flags} -o ./cmd/$(PROJECT_NAME)/$(BINARY_NAME) -v ./cmd/$(PROJECT_NAME)/main.go
+
+.PHONY: build-win
+build-win:
+	GOOS=windows GOARCH=amd64 $(GOBUILD) --ldflags ${flags} -o ./cmd/$(PROJECT_NAME)/$(BINARY_NAME).exe -v ./cmd/$(PROJECT_NAME)/main.go
+
+# 编译server程序
+build_server :
+	make build PROJECT_NAME:=cclogisticserver
+

+ 123 - 0
README.md

@@ -0,0 +1,123 @@
+# 项目名称
+- 冷链物流系统
+
+## 功能特性
+
+- 用户端下单
+- 司机端装货
+- 平台管理仓库,订单,车辆
+
+/Users/zoie/work/bzd_project/Cold_Logistic/go-backend
+## 快速开始
+
+### 依赖检查
+
+- 本项目使用`golang`开发,安装版本>= 1.21
+- 本项目使用`Mysql`数据库,安装版本>= 
+
+### 构建
+
+- 本项目使用Makefile进行构建
+- 在项目目录下执行`make`,将在`./cmd`目录下生成对应二进制执行文件(以项目目录名命名)
+- 也可使用命令构建 `go build -ldflags "-X gitee.com/hexingqq/go-backend/pkg/contrib/version.Version=1.0 -X gitee.com/hexingqq/go-backend/pkg/contrib/version.BuildTime=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" -o ./cmd/cclogisticserver/cclogistic_6270 -v ./cmd/cclogisticserver/main.go`
+- Linux运行需要加 `GOOS=linux GOARCH=amd64 go bulid `
+### 运行
+
+```shell script
+# 项目目录下执行
+# 编译
+make
+# 查看版本
+./cmd/<执行文件> version
+# 启动api服务
+./cmd/<执行文件> run --profile=./configs/test.yml
+```
+- [配置文件请参考](configs/test.yaml)
+- 前后端整体部署时需安装Nginx,相关conf文件参考如下:
+```text
+upstream cold-logistic {
+       server <cold-logistic进程ip:port> fail_timeout=0;
+    }
+
+
+server {
+    listen       443 ssl http2;
+    server_name  cold.coldbaozhida.com;
+    ssl_certificate     <xxxxx.cn_bundle.crt>;
+    ssl_certificate_key  <xxxxx..cn.key>;
+
+    error_log /var/log/nginx/error_Cold_Logistic.log;
+    access_log /var/log/nginx/access_Cold_Logistic.log main;
+
+    location /iblfront/Cold_Logistic {
+        if ($request_filename ~* .*\.(?:htm|html|exe|yaml|yml|exe.blockmap|json|mp3)$){
+            add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
+        }
+        alias <前端静态文件目录>;
+       }
+
+        location /Cold_Logistic/download/ {
+        add_header Access-Control-Allow-Methods *;
+        add_header Access-Control-Max-Age 3600;
+        add_header Access-Control-Allow-Credentials true;
+        add_header Access-Control-Allow-Origin *;
+        add_header Access-Control-Allow-Headers
+        $http_access_control_request_headers;
+        if ($request_method = OPTIONS){
+            return 200;
+        }
+        # add_header  Content-Type    "application/octet-stream";
+        alias <配置文件中storage.localstorage.rootFilepath>;
+       }
+
+        location /Cold_Logistic/api/ {
+        if ($request_method = OPTIONS){
+            return 200;
+            }
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-Proto https;
+        proxy_redirect off;
+        proxy_connect_timeout      240;
+        proxy_send_timeout         240;
+        proxy_read_timeout         240;
+        proxy_pass http://Cold_Logistic;
+       }
+
+    }
+
+    location / {
+        client_max_body_size 10m;
+        add_header Access-Control-Allow-Methods *;
+        add_header Access-Control-Max-Age 3600;
+        add_header Access-Control-Allow-Credentials true;
+        add_header Access-Control-Allow-Origin $http_origin;
+        add_header Access-Control-Allow-Headers
+        $http_access_control_request_headers;
+        if ($request_method = OPTIONS){
+            return 200;
+        }
+
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-Proto https;
+        proxy_redirect off;
+        proxy_connect_timeout      240;
+        proxy_send_timeout         240;
+        proxy_read_timeout         240;
+        proxy_pass http://Cold_Logistic;
+    }
+}
+```
+
+
+## 使用指南
+```shell script
+# 查看命令帮助信息
+./cmd/<二进制执行文件> --help 
+```
+- [项目框架说明文档](./doc/develop/framework.md)
+- [项目开发规范](./doc/develop/standards.md)
+
+## 【内部项目/非开源】
+- **未经授权严禁公开**

+ 53 - 0
cmd/cclogisticserver/main.go

@@ -0,0 +1,53 @@
+package main
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/pkg/common/options"
+	"Cold_Logistic/internal/server/adapter"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/app"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core/middleware"
+	"math/rand"
+	"runtime"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/app/server"
+	"gitee.com/hexingqq/go-backend/pkg/app/toolkit"
+)
+
+func init() {
+	rand.Seed(time.Now().UTC().UnixNano())
+	runtime.GOMAXPROCS(runtime.NumCPU())
+}
+
+// nohup ./Cold_Logistic run --profile=../configs/test.yaml &
+func main() {
+	opt := options.NewOptions()
+	s := server.NewServer(
+		server.WithCustomConfigStructPtr(opt),
+		server.WithOnConfigFileChange(opt),
+		server.WithHttpServer(
+			server.WithGlobalMiddleware(
+				middleware.AddRequestID(),
+				middleware.Limit(10000, 5*1000),
+			),
+			server.WithDefaultHealthApi(),
+			server.WithDefaultVersionApi(),
+			server.WithDefaultMetricApi(""),
+			server.WithDefaultPprofApi(""),
+			server.WithHTTPApi(adapter.HttpRoutes()),
+		),
+		server.WithCronJob(server.WithCronApi(adapter.RegisterCron())),
+		server.WithSelfMonitor(),
+		server.WithComponent(global.NewCommonConnectsRepo(opt)),
+	)
+
+	a := app.NewApp("server")
+	a.AddCommand(
+		s.NewRunCommand(),
+		toolkit.NewVersionCommand(a.GetFileName()),
+	)
+	if err := a.Run(); err != nil {
+		panic(fmt.Sprintf("Error:%v\n", err))
+	}
+}

+ 105 - 0
configs/test.yaml

@@ -0,0 +1,105 @@
+# ym测试环境
+# 服务相关配置
+server:
+  # 启动模式 debug、release
+  mode: release
+  # http服务信息
+  insecureServingInfo:
+    # 监听端口
+    port: "6270"
+
+# IP白名单
+ipWhiteList:
+  - "127.0.0.1"
+
+# 数据库配置
+database:
+  # 数据库类型
+  dialect: mysql
+  # host地址
+  host: 127.0.0.1
+  # 端口
+  port: 3306
+  # 数据库名称
+  db: cold_logistic
+  # 数据库用户名
+  userName: cold_logistic
+  # 数据库密码
+  password: A8XQfpezANM3pqD
+  # 其他配置参数
+  otherParams: charset=utf8mb4&parseTime=True&loc=Local
+  # 最大空闲连接数
+  maxIdleConn: 20
+  # 最大连接数
+  maxOpenConn: 200
+  # 连接超时关闭时间,单位:秒
+  connMaxLifetime: 60
+
+# redis配置
+redis:
+  # 是否启用
+  enable: true
+  # 地址
+  addr: 127.0.0.1:6379
+  # 数据库编号
+  db: 11
+
+# 日志相关配置
+log:
+  # 是否开启console输出
+  enableConsole: true
+  # console输出格式是否json格式
+  consoleJSONFormat: false
+  # console输出日志等级
+  consoleLevel: debug
+  # 是否开启文件输出
+  enableFile: true
+  # 文件输出格式是否json格式
+  fileJSONFormat: true
+  # 文件输出日志等级
+  fileLevel: info
+  # 输出文件路径
+  fileLocation: /tmp/Cold_Logistic/back/zap.log
+  # 错误日志文件等级
+  errFileLevel: error
+  # 错误日志文件路径
+  errFileLocation: /tmp/Cold_Logistic/back/zapErr.log
+
+# 存储相关配置
+storage:
+  projectPrefixPath:
+  # 类型 localFs-本地 cos-腾讯云对象存储
+  storeType: cos
+  cosStorageOptions:
+    baseURL:
+    appId: ""
+    bucket:
+    region:
+    secretId:
+    secretKey:
+  localstorage:
+    # 存储根路径(与nginx配置一致)
+    rootFilePath: /tmp/Cold_Logistic/upload/
+    # 生成文件下载地址url
+    downloadDomain: https://cold.coldbaozhida.com/Cold_Logistic/download
+
+# Nats
+nats:
+  enable: true
+  url: "127.0.0.1:43422"
+
+# 宝智达冷链
+bzdClod:
+  host: "https://cold.coldbaozhida.com"
+  deviceSensorList: "/api/v3/DeviceSensor/List_BySN"
+  dataListUrl: "/api/v3/Data/List"
+  userList: "/api/v3/User/List"
+  logisticCompanyList: "/api/v3/Company/Transport/List"
+
+# 微信
+wechat:
+  appId: ""
+  appSecret: ""
+  redirectUri: ""
+
+

+ 98 - 0
doc/develop/framework.md

@@ -0,0 +1,98 @@
+# 关于框架的设计说明
+
+## 目录说明:
+
+##### `/cmd`
+
+本项目的主干。不要在这个目录中放置太多代码。如果你认为代码可以导入并在其他项目中使用,那么它应该位于 `/pkg`
+目录中。如果代码不是可重用的,或者你不希望其他人重用它,请将该代码放到 `/internal`
+目录中。你会惊讶于别人会怎么做,所以要明确你的意图!
+通常有一个小的 `main` 函数,从 `/internal` 和 `/pkg` 目录导入和调用代码,除此之外没有别的东西。
+
+##### `/configs`
+
+配置文件相关。
+
+##### `/doc`
+
+设计和用户文档。
+
+##### `/internal`
+
+私有应用程序和库代码。
+应用程序共享的代码可以放在 `/internal/pkg` 目录下(例如 `/internal/pkg/myprivlib`)。
+
+##### `/pkg`
+
+外部应用程序可以使用的库代码。
+
+##### `/scripts`
+
+执行各种构建、安装、分析等操作的脚本。
+这些脚本可以配合根级别的 Makefile 使用,以保持 Makefile 简单明了。
+
+##### `/test`
+
+额外的外部测试应用程序和测试数据。
+
+##### `/tools`
+
+这个项目的支持工具。这些工具可以从 `/pkg` 和 `/internal` 目录导入代码。
+
+
+## 代码分层
+
+```
+业务代码主要分adapter层、application层、domain层、infra层
+上层可以调用任意下层
+
+adapter层主要作为接入层,可以是http接口也可以使用grpc
+application层主要是业务逻辑
+domain层主要用于长期开发过程的业务抽象,可以使用infra层,开发中应及时重构application层去合理复用domian层
+infra层主要是dao层、相关调用服务封装、存储数据定义
+```
+
+## code的定义
+
+- 目前有的项目是采用固定返回200 http status code的方式,有其合理性。比如,HTTP Code 通常代表 HTTP Transport 层的状态信息。当我们收到
+  HTTP 请求,并返回时,HTTP Transport 层是成功的,所以从这个层面上来看,HTTP Status 固定为 200 也是合理的。
+  但是这个方式的缺点也很明显:对于每一次请求,我们都要去解析 HTTP
+  Body,从中解析出错误码和错误信息。实际上,大部分情况下,我们对于成功的请求,要么直接转发,要么直接解析到某个结构体中;对于失败的请求,我们也希望能够更直接地感知到请求失败,特别是网关、监控等。
+
+- 因此推荐使用http status code + 自定义业务码,业务码需要有一定规则,可以通过业务码判断出是哪类错误。
+  请求出错时,可以通过http status code直接感知到请求出错。
+  需要在请求出错时,返回详细的信息,通常包括 3 类信息:业务 Code 码、错误信息和参考文档链接(可选)。
+  返回的错误信息,需要是可以直接展示给用户的安全信息,也就是说不能包含敏感信息;同时也要有内部更详细的错误信息,方便 debug。
+  返回的数据格式应该是固定的、规范的。
+  错误信息要保持简洁,并且提供有用的信息。
+
+- 自定义业务码说明:100101
+    - 10: 服务。
+    - 01: 某个服务下的某个模块。
+    - 01: 模块下的错误码序号,每个模块可以注册 100 个错误。
+
+- 通过100101可以知道这个错误是什么服务什么模块下的错误。
+  如果每个模块的错误码超过 100 个,说明这个模块可能太大了,建议拆分;也可能是错误码设计得不合理,共享性差,需要重新设计。
+
+- 可以看到 HTTP Code 有很多种,如果每个 Code 都做错误映射,会面临很多问题,在某些情况下不太好判断错误属于哪种http status
+  code,到最后很可能会导致错误或者http status code不匹配,变成一种形式。而且,客户端也难以应对这么多的 HTTP 错误码。
+  所以,http status code不要太多,基本上只需要这 6 个 HTTP Code:
+    - 200 - 表示请求成功执行。
+    - 400 - 表示客户端出问题。
+    - 401 - 表示认证失败。
+    - 403 - 表示授权失败。
+    - 404 - 表示资源找不到,这里的资源可以是 URL 或者 RESTful 资源。
+    - 500 - 表示服务端出问题。
+- 将错误码控制在适当的数目内,客户端比较容易处理和判断,开发也比较容易进行错误码映射
+
+## 项目的运行
+
+```shell script
+# 项目目录下执行
+# 编译
+make
+# 查看版本
+./cmd/<执行文件> version
+# 启动api服务
+./cmd/<执行文件> run --profile=./configs/test.yml
+```

+ 78 - 0
doc/develop/standards.md

@@ -0,0 +1,78 @@
+## 开发规范
+
+### 目录规范
+
+- 目录名称统一小写,尽量短命名,如:apiserver
+- 文件名称统一小写蛇形命名,如:xxx_demo.go
+- 变量名相关统一驼峰命名,如:xxxDemo XxxDemo
+- 前后端接口字段统一小驼峰,如:{"xxxDemo":"xxxx"}
+
+### 代码规范
+
+- 参考[`https://go.dev/doc/effective_go`](https://go.dev/doc/effective_go)
+- 对于业务代码的注释请优先使用中文母语
+
+### 接口规范
+
+- 返回参数约定
+
+```json
+{
+    "code":0,
+    "msg":"success",
+    "data":{
+        
+    }
+}
+
+```
+
+```json
+{
+    "code": 120001,
+    "msg":"xxxxxxxxxx",
+    "data":null
+}
+```
+
+### 错误码规范
+
+- 错误码常量命名需以Err开头
+- 常量的注释信息格式要求:// <http状态码> | <错误信息> | <详细信息>
+- 注意:<错误信息>为TmpMsg时,将使用动态的错误信息返回
+
+## 其他规范
+
+### 文档规范
+
+- api接口文档,统一写在`飞书文档`,每个接口至少包含如下说明:
+    - 通用说明
+    - 接口描述
+    - 请求方法
+    - 请求参数说明
+    - 输出参数说明
+    - 错误码描述
+    - 请求示例
+
+### commit规范
+
+- git commit时需标识类别:
+    - feat:<新增功能>
+    - fix:<bug修复>
+    - perf:<代码性能优化>
+    - style:<格式变更>
+    - refactor:<其他变更,如代码优化、变量名称修改、删除注释代码等>
+    - test:<新增测试相关>
+    - ci:<ci/cd相关配置或脚本变更>
+    - docs:<文档更新>
+    - chore:<其他>
+- 合理使用git rebase
+
+### 版本规范
+
+- 版本号可按以下规则递增:
+    - 主版本号(MAJOR):当做了不兼容的 API 修改。
+    - 次版本号(MINOR):当做了向下兼容的功能性新增及修改。偶数为稳定版本,奇数为开发版本。
+    - 修订号(PATCH):当做了向下兼容的问题修正。
+- 参考:https://semver.org/lang/zh-CN/
+

+ 154 - 0
go.mod

@@ -0,0 +1,154 @@
+module Cold_Logistic
+
+go 1.21.5
+
+require (
+	gitee.com/hexingqq/go-backend v0.0.0-00010101000000-000000000000
+	github.com/dlclark/regexp2 v1.10.0
+	github.com/gin-gonic/gin v1.9.1
+	github.com/go-ozzo/ozzo-validation/v4 v4.3.0
+	github.com/go-redis/redis/v8 v8.11.5
+	github.com/gogf/gf v1.16.9
+	github.com/golang-jwt/jwt/v4 v4.5.0
+	github.com/google/uuid v1.6.0
+	github.com/jinzhu/now v1.1.5
+	github.com/mozillazg/go-pinyin v0.20.0
+	github.com/nats-io/nats.go v1.33.1
+	github.com/satori/go.uuid v1.2.0
+	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
+	github.com/stretchr/testify v1.8.4
+	github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20231121073521-dd65d8941a16
+	github.com/vmihailenco/msgpack/v5 v5.4.1
+	github.com/xuri/excelize/v2 v2.8.0
+	gorm.io/datatypes v1.2.0
+	gorm.io/gorm v1.25.7
+)
+
+require (
+	github.com/BurntSushi/toml v1.1.0 // indirect
+	github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/bytedance/sonic v1.9.1 // indirect
+	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+	github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 // indirect
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/fatih/color v1.14.1 // indirect
+	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+	github.com/gin-contrib/pprof v1.4.0 // indirect
+	github.com/gin-contrib/sse v0.1.0 // indirect
+	github.com/go-ini/ini v1.67.0 // indirect
+	github.com/go-kratos/kratos/v2 v2.7.2 // indirect
+	github.com/go-logr/logr v1.2.4 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-ole/go-ole v1.2.6 // indirect
+	github.com/go-playground/locales v0.14.1 // indirect
+	github.com/go-playground/universal-translator v0.18.1 // indirect
+	github.com/go-playground/validator/v10 v10.14.0 // indirect
+	github.com/go-redsync/redsync/v4 v4.12.1 // indirect
+	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/gomodule/redigo v1.8.9 // indirect
+	github.com/google/go-querystring v1.0.0 // indirect
+	github.com/gorilla/websocket v1.4.2 // indirect
+	github.com/gosuri/uitable v0.0.4 // indirect
+	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
+	github.com/h2non/filetype v1.1.3 // indirect
+	github.com/hashicorp/errwrap v1.1.0 // indirect
+	github.com/hashicorp/go-multierror v1.1.1 // indirect
+	github.com/hashicorp/go-syslog v1.0.0 // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/imdario/mergo v0.3.16 // indirect
+	github.com/inconshreveable/mousetrap v1.1.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
+	github.com/jackc/pgx/v5 v5.4.3 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.17.2 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+	github.com/leodido/go-urn v1.2.4 // indirect
+	github.com/magiconair/properties v1.8.7 // indirect
+	github.com/matoous/go-nanoid/v2 v2.0.0 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
+	github.com/mattn/go-runewidth v0.0.9 // indirect
+	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
+	github.com/minio/minio-go v6.0.14+incompatible // indirect
+	github.com/mitchellh/go-homedir v1.1.0 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+	github.com/mozillazg/go-httpheader v0.2.1 // indirect
+	github.com/nats-io/nkeys v0.4.7 // indirect
+	github.com/nats-io/nuid v1.0.1 // indirect
+	github.com/oklog/ulid v1.3.1 // indirect
+	github.com/oklog/ulid/v2 v2.1.0 // indirect
+	github.com/olekukonko/tablewriter v0.0.5 // indirect
+	github.com/panjf2000/ants/v2 v2.9.0 // indirect
+	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+	github.com/prometheus/client_golang v1.9.0 // indirect
+	github.com/prometheus/client_model v0.2.0 // indirect
+	github.com/prometheus/common v0.15.0 // indirect
+	github.com/prometheus/procfs v0.2.0 // indirect
+	github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 // indirect
+	github.com/richardlehane/mscfb v1.0.4 // indirect
+	github.com/richardlehane/msoleps v1.0.3 // indirect
+	github.com/robfig/cron/v3 v3.0.1 // indirect
+	github.com/sagikazarmark/locafero v0.4.0 // indirect
+	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+	github.com/shirou/gopsutil v3.21.11+incompatible // indirect
+	github.com/sirupsen/logrus v1.7.0 // indirect
+	github.com/sony/sonyflake v1.2.0 // indirect
+	github.com/sourcegraph/conc v0.3.0 // indirect
+	github.com/speps/go-hashids v2.0.0+incompatible // indirect
+	github.com/spf13/afero v1.11.0 // indirect
+	github.com/spf13/cast v1.6.0 // indirect
+	github.com/spf13/cobra v1.8.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/spf13/viper v1.18.2 // indirect
+	github.com/subosito/gotenv v1.6.0 // indirect
+	github.com/tencentyun/cos-go-sdk-v5 v0.7.46 // indirect
+	github.com/tidwall/gjson v1.17.1 // indirect
+	github.com/tidwall/match v1.1.1 // indirect
+	github.com/tidwall/pretty v1.2.0 // indirect
+	github.com/tklauser/go-sysconf v0.3.11 // indirect
+	github.com/tklauser/numcpus v0.6.1 // indirect
+	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+	github.com/ugorji/go/codec v1.2.11 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+	github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
+	github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
+	github.com/yusufpapurcu/wmi v1.2.3 // indirect
+	github.com/zsais/go-gin-prometheus v0.1.0 // indirect
+	go.opentelemetry.io/otel v1.16.0 // indirect
+	go.opentelemetry.io/otel/metric v1.16.0 // indirect
+	go.opentelemetry.io/otel/trace v1.16.0 // indirect
+	go.uber.org/multierr v1.10.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
+	golang.org/x/arch v0.3.0 // indirect
+	golang.org/x/crypto v0.19.0 // indirect
+	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
+	golang.org/x/net v0.20.0 // indirect
+	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	golang.org/x/time v0.5.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect
+	google.golang.org/grpc v1.62.0 // indirect
+	google.golang.org/protobuf v1.32.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	gorm.io/driver/mysql v1.5.4 // indirect
+	gorm.io/driver/postgres v1.5.6 // indirect
+	mosn.io/api v1.5.0 // indirect
+	mosn.io/holmes v1.1.0 // indirect
+	mosn.io/pkg v1.6.0 // indirect
+)
+
+replace gitee.com/hexingqq/go-backend => /Users/zoie/work/bzd_project/BZD_libs/go-backend

+ 1130 - 0
go.sum

@@ -0,0 +1,1130 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
+github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
+github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk=
+github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
+github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
+github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
+github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
+github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
+github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
+github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28 h1:LdXxtjzvZYhhUaonAaAKArG3pyC67kGL3YY+6hGG8G4=
+github.com/clbanning/mxj v1.8.5-0.20200714211355-ff02cfb8ea28/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng=
+github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
+github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
+github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
+github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
+github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
+github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.11/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
+github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dubbogo/getty v1.3.4/go.mod h1:36f+gH/ekaqcDWKbxNBQk9b9HXcGtaI6YHxp4YTntX8=
+github.com/dubbogo/go-zookeeper v1.0.3/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c=
+github.com/dubbogo/gost v1.5.2/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8=
+github.com/dubbogo/gost v1.11.16/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI=
+github.com/dubbogo/jsonparser v1.0.1/go.mod h1:tYAtpctvSP/tWw4MeelsowSPgXQRVHHWbqL6ynps8jU=
+github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
+github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
+github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
+github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
+github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
+github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+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.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg=
+github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U=
+github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
+github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
+github.com/go-kratos/kratos/v2 v2.7.2 h1:WVPGFNLKpv+0odMnCPxM4ZHa2hy9I5FOnwpG3Vv4w5c=
+github.com/go-kratos/kratos/v2 v2.7.2/go.mod h1:rppuc8+pGL2UtXA29bgFHWKqaaF6b6GB2XIYiDvFBRk=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+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-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/go-ozzo/ozzo-validation/v4 v4.3.0 h1:byhDUpfEwjsVQb1vBunvIjh2BHQ9ead57VkAEY4V+Es=
+github.com/go-ozzo/ozzo-validation/v4 v4.3.0/go.mod h1:2NKgrcHl3z6cJs+3Oo940FPRiTzuqKbvfrL2RxCj6Ew=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
+github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+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-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4=
+github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
+github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-redsync/redsync/v4 v4.12.1 h1:hCtdZ45DJxMxNdPiby5GlQwOKQmcka2587Y466qPqlA=
+github.com/go-redsync/redsync/v4 v4.12.1/go.mod h1:sn72ojgeEhxUuRjrliK0NRrB0Zl6kOZ3BDvNN3P2jAY=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogf/gf v1.16.9 h1:Q803UmmRo59+Ws08sMVFOcd8oNpkSWL9vS33hlo/Cyk=
+github.com/gogf/gf v1.16.9/go.mod h1:8Q/kw05nlVRp+4vv7XASBsMe9L1tsVKiGoeP2AHnlkk=
+github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
+github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
+github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
+github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+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.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
+github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+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.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/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-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY=
+github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo=
+github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=
+github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw=
+github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
+github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
+github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
+github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
+github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
+github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY=
+github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
+github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
+github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/juju/ansiterm v0.0.0-20160907234532-b99631de12cf/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
+github.com/juju/clock v0.0.0-20190205081909-9c5c9712527c/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA=
+github.com/juju/cmd v0.0.0-20171107070456-e74f39857ca0/go.mod h1:yWJQHl73rdSX4DHVKGqkAip+huBslxRwS8m9CrOLq18=
+github.com/juju/collections v0.0.0-20200605021417-0d0ec82b7271/go.mod h1:5XgO71dV1JClcOJE+4dzdn4HrI5LiyKd7PlVG6eZYhY=
+github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
+github.com/juju/errors v0.0.0-20190930114154-d42613fe1ab9/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
+github.com/juju/errors v0.0.0-20200330140219-3fe23663418f/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
+github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
+github.com/juju/httpprof v0.0.0-20141217160036-14bf14c30767/go.mod h1:+MaLYz4PumRkkyHYeXJ2G5g5cIW0sli2bOfpmbaMV/g=
+github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
+github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
+github.com/juju/mgo/v2 v2.0.0-20210302023703-70d5d206e208/go.mod h1:0OChplkvPTZ174D2FYZXg4IB9hbEwyHkD+zT+/eK+Fg=
+github.com/juju/mutex v0.0.0-20171110020013-1fe2a4bf0a3a/go.mod h1:Y3oOzHH8CQ0Ppt0oCKJ2JFO81/EsWenH5AEqigLH+yY=
+github.com/juju/retry v0.0.0-20151029024821-62c620325291/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4=
+github.com/juju/retry v0.0.0-20180821225755-9058e192b216/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4=
+github.com/juju/testing v0.0.0-20180402130637-44801989f0f7/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
+github.com/juju/testing v0.0.0-20190723135506-ce30eb24acd2/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
+github.com/juju/testing v0.0.0-20210324180055-18c50b0c2098/go.mod h1:7lxZW0B50+xdGFkvhAb8bwAGt6IU87JB1H9w4t8MNVM=
+github.com/juju/utils v0.0.0-20180424094159-2000ea4ff043/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk=
+github.com/juju/utils v0.0.0-20200116185830-d40c2fe10647/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk=
+github.com/juju/utils/v2 v2.0.0-20200923005554-4646bfea2ef1/go.mod h1:fdlDtQlzundleLLz/ggoYinEt/LmnrpNKcNTABQATNI=
+github.com/juju/version v0.0.0-20161031051906-1f41e27e54f2/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U=
+github.com/juju/version v0.0.0-20180108022336-b64dbd566305/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U=
+github.com/juju/version v0.0.0-20191219164919-81c1be00b9a6/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U=
+github.com/julienschmidt/httprouter v1.1.1-0.20151013225520-77a895ad01eb/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
+github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
+github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
+github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE=
+github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8=
+github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0=
+github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
+github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
+github.com/lunixbochs/vtclean v0.0.0-20160125035106-4fbf7632a2c6/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
+github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/masterzen/azure-sdk-for-go v3.2.0-beta.0.20161014135628-ee4f0065d00c+incompatible/go.mod h1:mf8fjOu33zCqxUjuiU3I8S1lJMyEAlH+0F2+M5xl3hE=
+github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
+github.com/masterzen/winrm v0.0.0-20161014151040-7a535cd943fc/go.mod h1:CfZSN7zwz5gJiFhZJz49Uzk7mEBHIceWmbFmYx7Hf7E=
+github.com/masterzen/xmlpath v0.0.0-20140218185901-13f4951698ad/go.mod h1:A0zPC53iKKKcXYxr4ROjpQRQ5FgJXtelNdSmHHuq/tY=
+github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U=
+github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0=
+github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g=
+github.com/mattn/go-colorable v0.0.6/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.0-20160806122752-66b8e73f3f5c/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
+github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI=
+github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/microsoft/go-mssqldb v0.17.0 h1:Fto83dMZPnYv1Zwx5vHHxpNraeEaUlQ/hhHLgZiaenE=
+github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
+github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+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/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+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/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
+github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
+github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ=
+github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nacos-group/nacos-sdk-go v1.0.8/go.mod h1:hlAPn3UdzlxIlSILAyOXKxjFSvDJ9oLzTJ9hLAK1KzA=
+github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
+github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
+github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
+github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w=
+github.com/nats-io/nats.go v1.33.1 h1:8TxLZZ/seeEfR97qV0/Bl939tpDnt2Z2fK3HkPypj70=
+github.com/nats-io/nats.go v1.33.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
+github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
+github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
+github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
+github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
+github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
+github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
+github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
+github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+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.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
+github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
+github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
+github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4=
+github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM=
+github.com/panjf2000/ants/v2 v2.9.0 h1:SztCLkVxBRigbg+vt0S5QvF5vxAbxbKt09/YfAJ0tEo=
+github.com/panjf2000/ants/v2 v2.9.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
+github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
+github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
+github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
+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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
+github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU=
+github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM=
+github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
+github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ=
+github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk=
+github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
+github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo=
+github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo=
+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.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
+github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
+github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shirou/gopsutil v3.20.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
+github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
+github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/soheilhy/cmux v0.1.5-0.20210205191134-5ec6847320e5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
+github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
+github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ=
+github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/speps/go-hashids v2.0.0+incompatible h1:kSfxGfESueJKTx0mpER9Y/1XHl+FVQjtCqRyYcviFbw=
+github.com/speps/go-hashids v2.0.0+incompatible/go.mod h1:P7hqPzMdnZOfyIk+xrlG1QaSMw+gCBdHKsBDnhpaZvc=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
+github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
+github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
+github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
+github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
+github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM=
+github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.563/go.mod h1:uom4Nvi9W+Qkom0exYiJ9VWJjXwyxtPYTkKkaLMlfE0=
+github.com/tencentyun/cos-go-sdk-v5 v0.7.46 h1:IeTiMR8qZ7iQWhAGb1niw5vt0T1TfAwPeB8Gn/oTkuk=
+github.com/tencentyun/cos-go-sdk-v5 v0.7.46/go.mod h1:DH9US8nB+AJXqwu/AMOrCFN1COv3dpytXuJWHgdg7kE=
+github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20231121073521-dd65d8941a16 h1:YaOIyT5tLaIcAUqZhI9vVaKQ1MuYIdouxxFUDkZ8KkM=
+github.com/tencentyun/qcloud-cos-sts-sdk v0.0.0-20231121073521-dd65d8941a16/go.mod h1:b18KQa4IxHbxeseW1GcZox53d7J0z39VNONTxvvlkXw=
+github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U=
+github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
+github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
+github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
+github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
+github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
+github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
+github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
+github.com/valyala/fasthttp v1.14.1-0.20200605121233-ac51d598dc54/go.mod h1:hWrFNtR2Jc1XrK0fDq2Y+MkA7F/v3lYKRDXd2CmSikc=
+github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
+github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca h1:uvPMDVyP7PXMMioYdyPH+0O+Ta/UO1WFfNYMO3Wz0eg=
+github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
+github.com/xuri/excelize/v2 v2.8.0 h1:Vd4Qy809fupgp1v7X+nCS/MioeQmYVVzi495UCTqB7U=
+github.com/xuri/excelize/v2 v2.8.0/go.mod h1:6iA2edBTKxKbZAa7X5bDhcCg51xdOn1Ar5sfoXRGrQg=
+github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a h1:Mw2VNrNNNjDtw68VsEj2+st+oCSn4Uz7vZw6TbhcV1o=
+github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+github.com/zsais/go-gin-prometheus v0.1.0 h1:bkLv1XCdzqVgQ36ScgRi09MA2UC1t3tAB6nsfErsGO4=
+github.com/zsais/go-gin-prometheus v0.1.0/go.mod h1:Slirjzuz8uM8Cw0jmPNqbneoqcUtY2GGjn2bEd4NRLY=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
+go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
+go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw=
+go.etcd.io/etcd/client/v2 v2.305.0-alpha.0/go.mod h1:kdV+xzCJ3luEBSIeQyB/OEKkWKd8Zkux4sbDeANrosU=
+go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8=
+go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY=
+go.etcd.io/etcd/raft/v3 v3.5.0-alpha.0/go.mod h1:FAwse6Zlm5v4tEWZaTjmNhe17Int4Oxbu7+2r0DiD3w=
+go.etcd.io/etcd/server/v3 v3.5.0-alpha.0/go.mod h1:tsKetYpt980ZTpzl/gb+UOJj9RkIyCb1u4wjzMg90BQ=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
+go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s=
+go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4=
+go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo=
+go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4=
+go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
+go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs=
+go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+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.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
+go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
+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/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.0.0-20180214000028-650f4a345ab4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/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-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8=
+golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
+golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20180406214816-61147c48b25b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/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-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
+golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200602100848-8d3cce7afc34/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
+golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/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-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk=
+google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
+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.22.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.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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-20200227125254-8fa46927fb4f/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/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
+gopkg.in/errgo.v1 v1.0.0-20161222125816-442357a80af5/go.mod h1:u0ALmqvLRxLI95fkdCEWrE6mhWYZW1aMOJHp5YXLHTg=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
+gopkg.in/httprequest.v1 v1.1.1/go.mod h1:/CkavNL+g3qLOrpFHVrEx4NKepeqR4XTZWNj4sGGjz0=
+gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+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/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+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.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk=
+gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/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.3/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.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco=
+gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04=
+gorm.io/driver/mysql v1.5.4 h1:igQmHfKcbaTVyAIHNhhB888vvxh8EdQ2uSUT0LPcBso=
+gorm.io/driver/mysql v1.5.4/go.mod h1:9rYxJph/u9SWkWc9yY4XJ1F/+xO0S/ChOmbk3+Z5Tvs=
+gorm.io/driver/postgres v1.5.6 h1:ydr9xEd5YAM0vxVDY0X139dyzNz10spDiDlC7+ibLeU=
+gorm.io/driver/postgres v1.5.6/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
+gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU=
+gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI=
+gorm.io/driver/sqlserver v1.4.1 h1:t4r4r6Jam5E6ejqP7N82qAJIJAht27EGT41HyPfXRw0=
+gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHDnJLig=
+gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM=
+launchpad.net/xmlpath v0.0.0-20130614043138-000000000004/go.mod h1:vqyExLOM3qBx7mvYRkoxjSCF945s0mbe7YynlKYXtsA=
+mosn.io/api v0.0.0-20210204052134-5b9a826795fd/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc=
+mosn.io/api v1.5.0 h1:Y9s6NHJx0etcqIDDP7XeoTfgceDFMBnrZphxqDsxWOE=
+mosn.io/api v1.5.0/go.mod h1:mJX2oRJkrXjLN6hY1Wwrlxj0F+RqEPOMhbf2WhZO+VY=
+mosn.io/holmes v1.1.0 h1:FZ7slqsSHYGijYXzseqC3Zr2GfeGCIlHzSLgHmK/FE0=
+mosn.io/holmes v1.1.0/go.mod h1:pZjPamcZk4Z16xlZySG1rU9psLUCOx6MVNuj/3bfkEk=
+mosn.io/pkg v0.0.0-20211217101631-d914102d1baf/go.mod h1:tK3Vbw6CcVeJ9H/BGjJ1wn6hRXt4Oxjfq1+gkOM0zG8=
+mosn.io/pkg v1.6.0 h1:R+T344PEp7CauQvXEitDJTXQ0bIeOhLwnaey9qwN4Fs=
+mosn.io/pkg v1.6.0/go.mod h1:/EptiefKMKBRvrveNPYEAAgthCTSme52sLMlBXBIBm8=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=

+ 38 - 0
internal/pkg/common/codex/code_gen.go

@@ -0,0 +1,38 @@
+// Code generated by lance DO NOT EDIT
+// Package const code comment msg
+package codex
+
+import (
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core/code"
+)
+
+func init() {
+
+	code.RegisterCode(ErrSystemSrv, 500, "系统错误")
+	code.RegisterCode(ErrAccountQueryFailed, 500, "账号查询失败")
+	code.RegisterCode(ErrPlaceOrderFailed, 500, "下单失败")
+	code.RegisterCode(ErrParamValidate, 400, "TmpMsg")
+	code.RegisterCode(ErrBindJSON, 400, "不合规的JSON数据类型定义")
+	code.RegisterCode(ErrInvalidAuthHeader, 401, "Invalid authorization header.")
+	code.RegisterCode(ErrSignatureInvalid, 401, "未登录(Signature is invalid)")
+	code.RegisterCode(ErrLoginInvalid, 401, "账号不存在或密码错误")
+	code.RegisterCode(ErrLogoutInvalid, 500, "登出错误")
+	code.RegisterCode(ErrFindAccountInvalid, 401, "ErrFindAccountInvalid")
+	code.RegisterCode(ErrCaptchaInvalid, 401, "验证码错误")
+	code.RegisterCode(ErrClientIp, 403, "Client Ip Must Be LocalHost")
+	code.RegisterCode(ErrXRequestIdHeader, 400, "Invalid X-Request-Id header.")
+	code.RegisterCode(ErrLoginFailed, 400, "TmpMsg")
+	code.RegisterCode(ErrOperationForbideen, 403, "无权访问!")
+	code.RegisterCode(ErrResourceNotFound, 400, "资源不存在")
+	code.RegisterCode(ErrOperationFailed, 500, "操作失败")
+	code.RegisterCode(ErrOpPermissionFailed, 500, "权限验证失败")
+	code.RegisterCode(ErrNameExisted, 400, "该名称重复")
+	code.RegisterCode(ErrQueryFailed, 500, "查询失败")
+	code.RegisterCode(ErrSaveFailed, 500, "保存失败")
+	code.RegisterCode(ErrDeletedFailed, 500, "删除失败")
+	code.RegisterCode(ErrGetUploadKeyFailed, 500, "获取上传秘钥失败")
+	code.RegisterCode(ErrFileTitleNotMatch, 400, "文件标题不匹配")
+	code.RegisterCode(ErrUrlExpires, 403, "链接已过期")
+	code.RegisterCode(ErrUrlInvalid, 403, "TmpMsg")
+	code.RegisterCode(ErrNoDataPermission, 403, "TmpMsg")
+}

+ 31 - 0
internal/pkg/common/codex/code_gen.md

@@ -0,0 +1,31 @@
+
+# Error Code Doc
+| Code | HTTP Code | Description | Ref Doc|
+|:----|:----|:----|:----|
+| 110101 | 500 | 系统错误 | |
+| 110201 | 500 | 账号查询失败 | |
+| 110202 | 500 | 下单失败 | |
+| 110001 | 400 | TmpMsg | |
+| 110002 | 400 | 不合规的JSON数据类型定义 | |
+| 110003 | 401 | Invalid authorization header. | |
+| 110004 | 401 | 未登录(Signature is invalid) | |
+| 110005 | 401 | 账号不存在或密码错误 | |
+| 110006 | 500 | 登出错误 | |
+| 110007 | 401 | ErrFindAccountInvalid | |
+| 110008 | 401 | 验证码错误 | |
+| 110009 | 403 | Client Ip Must Be LocalHost | |
+| 110010 | 400 | Invalid X-Request-Id header. | |
+| 110011 | 400 | TmpMsg | |
+| 110012 | 403 | 无权访问! | |
+| 110013 | 400 | 资源不存在 | |
+| 110014 | 500 | 操作失败 | |
+| 110015 | 500 | 权限验证失败 | |
+| 110016 | 400 | 该名称重复 | |
+| 110017 | 500 | 查询失败 | |
+| 110018 | 500 | 保存失败 | |
+| 110019 | 500 | 删除失败 | |
+| 110020 | 500 | 获取上传秘钥失败 | |
+| 110021 | 400 | 文件标题不匹配 | |
+| 110022 | 403 | 链接已过期 | |
+| 110023 | 403 | TmpMsg | |
+| 110024 | 403 | TmpMsg | |

+ 20 - 0
internal/pkg/common/codex/codes.go

@@ -0,0 +1,20 @@
+package codex
+
+// 将在当前目录下生成相关代码与文档
+//go:generate lance codegen
+
+// 错误码常量命名需以Err开头
+// <http状态码> | <错误信息> | <详细信息>
+// 注意:<错误信息>为TmpMsg时,将使用动态的错误信息返回
+
+const (
+	CommonModule int = iota*100 + 110001
+	SystemModule     // 系统错误
+	BizModule        // 业务错误
+)
+
+// system
+const (
+	// 500 | 系统错误
+	ErrSystemSrv int = iota + SystemModule
+)

+ 8 - 0
internal/pkg/common/codex/codes_biz.go

@@ -0,0 +1,8 @@
+package codex
+
+const (
+	// 500 | 账号查询失败
+	ErrAccountQueryFailed int = iota + BizModule
+	// 500 | 下单失败
+	ErrPlaceOrderFailed
+)

+ 55 - 0
internal/pkg/common/codex/codes_common.go

@@ -0,0 +1,55 @@
+package codex
+
+// 公用
+const (
+	// 400 | TmpMsg
+	ErrParamValidate int = iota + CommonModule
+	// 400 | 不合规的JSON数据类型定义
+	ErrBindJSON
+	// 401 | Invalid authorization header.
+	ErrInvalidAuthHeader
+	// 401 | 未登录(Signature is invalid)
+	ErrSignatureInvalid
+	// 401 | 账号不存在或密码错误
+	ErrLoginInvalid
+	// 500 | 登出错误
+	ErrLogoutInvalid
+	// 401 | ErrFindAccountInvalid
+	ErrFindAccountInvalid
+	// 401 | 验证码错误
+	ErrCaptchaInvalid
+	// 403 | Client Ip Must Be LocalHost
+	ErrClientIp
+	// 400 | Invalid X-Request-Id header.
+	ErrXRequestIdHeader
+	// 400 | TmpMsg
+	ErrLoginFailed
+	// 403 | 无权访问!
+	ErrOperationForbideen
+	// 400 | 资源不存在
+	ErrResourceNotFound
+	// 500 | 操作失败
+	ErrOperationFailed
+	// 500 | 权限验证失败
+	ErrOpPermissionFailed
+	// 400 | 该名称重复
+	ErrNameExisted
+	// 500 | 查询失败
+	ErrQueryFailed
+	// 500 | 保存失败
+	ErrSaveFailed
+	// 500 | 删除失败
+	ErrDeletedFailed
+	// 500 | 获取上传秘钥失败
+	ErrGetUploadKeyFailed
+	// 400 | 文件标题不匹配
+	ErrFileTitleNotMatch
+	// 403 | 链接已过期
+	ErrUrlExpires
+	// 403 | TmpMsg
+	ErrUrlInvalid
+	// 403 | TmpMsg
+	ErrNoDataPermission
+	// 403 | access token expired
+	ErrStatusForbidden
+)

+ 39 - 0
internal/pkg/common/constant/base.go

@@ -0,0 +1,39 @@
+package constant
+
+const (
+	TimeCriterionFormat = "2006-01-02 15:04:05"
+	TimeMergeFormat     = "20060102150405"
+)
+
+const (
+	TraceIDHeader    = "X-Request-Id"
+	XTimestampHeader = "X-Timestamp"
+	Authorization    = "Authorization"
+	AuthQrCode       = "X-QrCode"
+)
+
+const (
+	TokenInfoKey = "TokenInfoKey"
+)
+
+const MaxFileNameLength = 100
+
+const (
+	AuthTokenTypeBasic  = "Basic"  // 平台内部账号的token验证
+	AuthTokenTypeBearer = "Bearer" // 微信小程序用户的token验证
+)
+
+const (
+	RootPath       = "/Cold_Logistic"
+	PdfStoragePath = RootPath + "/pdf"
+	UploadPath     = RootPath + "/upload"
+	ExcelPath      = RootPath + "/excel"
+	ExportPath     = RootPath + "/export"
+)
+
+const (
+	CCLPlatformLoginJWTISS = "cclPlatformLogin"
+	CCLAppletLoginJWTISS   = "cclAppletLogin"
+)
+
+const LimitKeyCounterPrefix = "limitKeyCounterPrefix:"

+ 86 - 0
internal/pkg/common/constant/constant.go

@@ -0,0 +1,86 @@
+package constant
+
+import "time"
+
+// 系统类型
+const (
+	AccountPlatform = 1 // 平台
+	AccountApplet   = 2 // 普通用户
+)
+
+// 图片资源类型
+const (
+	SourceTypeImage = 1 // 普通图片
+	SourceTypePDF   = 2 // PDF文件
+	SourceTypeExcel = 3 // excel文件
+)
+
+const (
+	ImageFileSourceCodePrefix = "img-"      // 图片
+	SliceFileSourceCodePrefix = "slice-"    // 切片
+	PDFFileSourceCodePrefix   = "pdf-"      // pdf
+	ExcelFileSourceCodePrefix = "excel-"    // excel
+	ExamCodePrefix            = "exam-"     // exam
+	LearningCodePrefix        = "learning-" // 学习资料
+	ClassCodePrefix           = "class-"    // 班级
+)
+
+// 排重类型
+const (
+	DuplicateTypeSkip  = "skip"  // 跳过
+	DuplicateTypeCover = "cover" // 覆盖
+)
+
+// 权限类型
+const (
+	PermisTypeMenu = 1 // 菜单权限
+	PermisTypeFunc = 2 // 功能权限
+	PermisTypeData = 3 // 数据权限
+)
+
+// 数据权限code
+const (
+	DataPermCodeOwner   = "data:owner:1"
+	DataPermCodeSameOrg = "data:sameorg:1"
+	DataPermCodeAll     = "data:all:1"
+)
+
+// 用户订单状态
+const (
+	OrderStatusPending   = 101 // 待处理
+	OrderStatusWaitCar   = 102 // 待装车
+	OrderStatusInTransit = 103 // 运输中
+	OrderStatusReceived  = 104 // 已签收
+)
+
+// 任务状态
+const (
+	TaskStatusPending   = 201 // 待处理
+	TaskStatusExecuting = 202 // 执行中
+	TaskStatusFinished  = 203 // 已完成
+)
+
+// 订单库中状态
+const (
+	WarehouseStatusIn  = 301 // 库中
+	WarehouseStatusOut = 302 // 已出库
+)
+
+const (
+	LogisticLogTraffic   = "traffic"   // 运输
+	LogisticLogWarehouse = "warehouse" // 仓储
+)
+
+// 运输目的地
+const (
+	DestinationDest    = "dest"    // 终点
+	DestinationTransit = "transit" // 中转
+)
+
+const (
+	RoleUser      = "user"      // user-用户
+	RoleDriver    = "driver"    // driver-司机
+	RoleWarehouse = "warehouse" // warehouse-仓管
+)
+
+const DefaultTokenLimit = 7 * 24 * time.Hour

+ 14 - 0
internal/pkg/common/constant/dict.go

@@ -0,0 +1,14 @@
+package constant
+
+const (
+	AddressTypeSender    = "addressType:sender"
+	AddressTypeConsignee = "addressType:consignee"
+)
+
+const (
+	TemplateAssignOrder = "已为您指定揽件员,等待揽件员【%s】上门揽件"
+	TemplateIntoCar     = "您的货物已由揽件员【%s】完成装车"
+	TemplateSignReceipt = "货物已签收"
+	TemplateIntoHouse   = "您的订单已到达【%s】中转站"
+	TemplateOutHouse    = "您的订单已从中转站再次出发"
+)

+ 96 - 0
internal/pkg/common/constant/enums.go

@@ -0,0 +1,96 @@
+package constant
+
+import (
+	"time"
+
+	"github.com/jinzhu/now"
+)
+
+// 需要自定义类型的常量放在这里
+
+type General = int
+
+// 不在dao层中使用,在dao层使用models.No, models.Yes
+const (
+	YES General = 1 // 是
+	NO  General = 2 // 否
+)
+
+// UploadFileType 上传文件类型
+type UploadFileType = int
+
+const (
+	UploadFileTypePic   UploadFileType = 1 // 普通图片
+	UploadFileTypePdf   UploadFileType = 2 // pdf
+	UploadFileTypeExcel UploadFileType = 3 // excel
+	ExportFileTypeExcel UploadFileType = 3 // 导出的excel文件
+)
+
+const MaxFileSize int64 = 10 * 1024 * 1024
+
+// ==========================================
+
+type SearchDateTimeType string
+
+const (
+	Today         SearchDateTimeType = "today"         // 今天
+	Yesterday     SearchDateTimeType = "yesterday"     // 昨天
+	ThisWeek      SearchDateTimeType = "thisWeek"      // 本周
+	ThisMonth     SearchDateTimeType = "thisMonth"     // 本月
+	LastThreeDays SearchDateTimeType = "lastThreeDays" // 近三天
+	LastSevenDays SearchDateTimeType = "lastSevenDays" // 近七天
+	LastMonthDays SearchDateTimeType = "lastMonthDays" // 近一个月
+)
+
+func (s SearchDateTimeType) GetRangeTime() (startTime, endTime time.Time) {
+	switch s {
+	case Today:
+		return now.BeginningOfDay(), now.EndOfDay()
+	case Yesterday:
+		t := time.Now().AddDate(0, 0, -1)
+		nTime := now.New(t)
+		return nTime.BeginningOfDay(), nTime.EndOfDay()
+	case ThisWeek:
+		return now.BeginningOfWeek(), now.EndOfWeek()
+	case ThisMonth:
+		return now.BeginningOfMonth(), now.EndOfMonth()
+	case LastThreeDays:
+		return now.New(time.Now().AddDate(0, 0, -2)).BeginningOfDay(), now.EndOfDay()
+	case LastSevenDays:
+		return now.New(time.Now().AddDate(0, 0, -6)).BeginningOfDay(), now.EndOfDay()
+	case LastMonthDays:
+		return now.New(time.Now().AddDate(0, 0, -29)).BeginningOfDay(), now.EndOfDay()
+	default:
+		return time.Time{}, time.Time{}
+	}
+}
+
+type PermissionType = int
+
+const (
+	PermissionPathSplit string         = ";"
+	PermissionMenu      PermissionType = 1 // 菜单权限
+	PermissionFunc      PermissionType = 2 // 功能权限
+)
+
+// ExpiredTime 过期时间
+type ExpiredTime string
+
+const (
+	ExpiredTimeOneDay   ExpiredTime = "oneDay"   // 一天;24小时
+	ExpiredTimeThreeDay ExpiredTime = "threeDay" // 三天
+	ExpiredTimeSevenDay ExpiredTime = "sevenDay" // 七天
+)
+
+func (e ExpiredTime) GetExpiredTime() time.Time {
+	switch e {
+	case ExpiredTimeOneDay:
+		return time.Now().AddDate(0, 0, 1)
+	case ExpiredTimeThreeDay:
+		return time.Now().AddDate(0, 0, 3)
+	case ExpiredTimeSevenDay:
+		return time.Now().AddDate(0, 0, 7)
+	default:
+		return time.Time{}
+	}
+}

+ 67 - 0
internal/pkg/common/global/connect.go

@@ -0,0 +1,67 @@
+package global
+
+import (
+	"Cold_Logistic/internal/pkg/common/options"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myorm"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myredis"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/objectStore"
+	"github.com/go-redis/redis/v8"
+	"github.com/nats-io/nats.go"
+	"gorm.io/gorm"
+)
+
+var CommonConnectRepoInst = &CommonConnectsRepo{}
+
+// CommonConnectsRepo 公用连接资源管理维护
+type CommonConnectsRepo struct {
+	opt         *options.Options
+	StoreDB     *gorm.DB
+	ObjectStore objectStore.ObjectStore
+	Redis       *redis.Client
+	NatsConn    *nats.Conn
+}
+
+func NewCommonConnectsRepo(opt *options.Options) *CommonConnectsRepo {
+	return &CommonConnectsRepo{opt: opt}
+}
+
+func (c *CommonConnectsRepo) Run() {
+	// mysql
+	c.StoreDB = myorm.InitMysql(*c.opt.DB)
+
+	//// 存储
+	//objStore, err := objectStore.NewObjectStoreByStoreType(c.opt.Storage.StoreType, *c.opt.Storage)
+	//if err != nil {
+	//	log.Panicf("初始化objectStore失败:%s", err)
+	//}
+	//c.ObjectStore = objStore
+
+	// Redis
+	if c.opt.Redis.Enable {
+		c.Redis = myredis.InitRedis(c.opt.Redis)
+	}
+
+	// Nats
+	natsConn := options.InitNats(*c.opt.Nats)
+	c.NatsConn = natsConn
+
+	CommonConnectRepoInst = c
+}
+
+func (c *CommonConnectsRepo) Close() {
+	if c.StoreDB != nil {
+		db, _ := c.StoreDB.DB()
+		db.Close()
+		log.Info("Mysql dbClient close...")
+	}
+	if c.Redis != nil {
+		c.Redis.Close()
+		log.Info("Redis client close...")
+	}
+	if c.NatsConn != nil {
+		c.NatsConn.Close()
+		log.Info("Nats client close...")
+	}
+
+}

+ 18 - 0
internal/pkg/common/global/ctx_trace.go

@@ -0,0 +1,18 @@
+package global
+
+import (
+	"context"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/consts"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	uuid "github.com/satori/go.uuid"
+)
+
+func MakeTraceCtx(ctx context.Context, keysAndValues ...interface{}) context.Context {
+	requestId := uuid.NewV4().String()
+	ctx = context.WithValue(ctx, consts.TraceIDHeader, requestId)
+	keysAndValues = append([]interface{}{consts.TraceIDHeader, requestId}, keysAndValues...)
+	ctxLog := log.WithValues(keysAndValues...)
+	ctx = context.WithValue(ctx, log.GetContextKey(), ctxLog)
+	return ctx
+}

+ 86 - 0
internal/pkg/common/global/struct.go

@@ -0,0 +1,86 @@
+package global
+
+import (
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+// UserContextPermisVO 平铺权限
+type UserContextPermisVO struct {
+	PermisCode []string       // 功能菜单权限code码
+	PermisFunc map[string]int // 功能权限
+}
+
+// PermisTreeRespVo 权限树
+type PermisTreeRespVo struct {
+	Code       string              `json:"code"`       // 权限唯一编码
+	Name       string              `json:"name"`       // 权限名称
+	ParentCode string              `json:"parentCode"` // 父Code
+	Path       string              `json:"path"`       // 前端路径
+	Selected   int                 `json:"selected"`   // 是否选中 1-是,0-否
+	Sort       int                 `json:"sort"`       // 排序号
+	Type       int                 `json:"type"`       // 1-功能权限;2-菜单权限;3-数据权限
+	Childes    []*PermisTreeRespVo `json:"childes"`    // 子节点
+}
+
+type DataPermisRespVo struct {
+	Code string `json:"code"` // 权限唯一编码
+	Name string `json:"name"` // 权限名称
+	Sort int    `json:"sort"` // 排序号
+}
+
+// AccountInfoVo 个人账号信息
+type AccountInfoVo struct {
+	AccountId   int             `json:"accountId"`   // 账号ID
+	AccountType int             `json:"accountType"` // 账号类型
+	AccountUuid string          `json:"accountUuid"`
+	Openid      string          `json:"openid"`      // 微信Openid
+	Name        string          `json:"name"`        // 真实名称
+	Role        string          `json:"role"`        // 角色:用户 司机 仓管
+	Gender      string          `json:"gender"`      // 性别
+	Phone       string          `json:"phone"`       // 电话
+	CompanyName string          `json:"companyName"` // 公司
+	Avatar      core.FileSource `json:"avatar"`      // 头像
+	IsFirst     int             `json:"isFirst"`     // 是否首次登录,1-是 2-否
+}
+
+// Credentials 临时秘钥
+type Credentials struct {
+	BaseUrl      string `json:"baseUrl"`
+	Bucket       string `json:"bucket"`
+	Region       string `json:"region"`
+	StartTime    int    `json:"startTime"`
+	ExpiredTime  int    `json:"expiredTime"`
+	TmpSecretID  string `json:"tmpSecretId"`
+	TmpSecretKey string `json:"tmpSecretKey"`
+	SessionToken string `json:"sessionToken"`
+}
+
+type SimpleFileSource struct {
+	FileId     int    `json:"fileId"`
+	FileUrl    string `json:"fileUrl"`
+	FilePath   string `json:"filePath"`
+	FileName   string `json:"fileName"`
+	SourceCode string `json:"sourceCode"`
+}
+
+// SnIdVO sn设备信息
+type SnIdVO struct {
+	Id   int    `json:"id"`
+	Name string `json:"name"`
+}
+
+// ClodAccount 冷链3.0账号
+type ClodAccount struct {
+	Pid  int    `json:"pid"`
+	Name string `json:"name"`
+	Uuid string `json:"uuid"`
+}
+
+func (r *ClodAccount) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.Pid, validation.Required),
+		validation.Field(&r.Uuid, validation.Required),
+		validation.Field(&r.Name, validation.Required),
+	)
+}

+ 37 - 0
internal/pkg/common/global/token.go

@@ -0,0 +1,37 @@
+package global
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"context"
+	"encoding/json"
+)
+
+type TokenInfo struct {
+	AccountId   int    `json:"accountId"`   // 账号ID
+	AccountUuid string `json:"accountUuid"` // 冷链系统的账号ID
+	Pid         int    `json:"pid"`         // 公司ID;冷链系统那边的
+	AccountType int    `json:"accountType"` // 账号类型
+	Role        string `json:"role"`        // 角色
+	Name        string `json:"name"`        // 名字
+	Phone       string `json:"phone"`       // 手机号
+	Gender      string `json:"gender"`      // 性别
+	CompanyName string `json:"companyName"` // 公司
+	Openid      string `json:"openid"`      // 微信Id
+	IsFirst     int    `json:"isFirst"`     // 是否首次登录,1-是 2-否
+	UsePid      int    `json:"usePid"`      // 登录账号所使用的公司ID
+	PowerId     int    `json:"powerId"`     // 权限ID
+	CarId       int    `json:"carId"`       // 车ID
+	WarehouseId int    `json:"warehouseId"` // 仓库ID
+}
+
+// MarshalBinary ..
+func (d *TokenInfo) MarshalBinary() ([]byte, error) {
+	return json.Marshal(d)
+}
+
+func GetTokenInfoFromContext(c context.Context) TokenInfo {
+	if t, ok := c.Value(constant.TokenInfoKey).(TokenInfo); ok {
+		return t
+	}
+	return TokenInfo{}
+}

+ 48 - 0
internal/pkg/common/options/baseOptions.go

@@ -0,0 +1,48 @@
+package options
+
+import (
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myredis"
+	"sync"
+
+	"gitee.com/hexingqq/go-backend/pkg/app/server"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myorm"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/objectStore"
+)
+
+type Options struct {
+	Log         *log.Options         `json:"log"`
+	Server      *server.SeverOption  `json:"server" mapstructure:"server"`
+	DB          *myorm.DBOption      `json:"database" mapstructure:"database"`
+	IpWhiteList []string             `json:"ipWhiteList" mapstructure:"ipWhiteList"`
+	Storage     *objectStore.Options `json:"storage" mapstructure:"storage"`
+	Nats        *NatsOption          `json:"nats" `
+	BzdClod     *BzdOption           `json:"bzdClod" mapstructure:"bzdClod"`
+	Wechat      *WechatOption        `json:"wechat" mapstructure:"wechat"`
+	Redis       *myredis.RedisOption `json:"redis"`
+}
+
+var (
+	once        sync.Once
+	OptInstance *Options
+)
+
+func NewOptions() *Options {
+	once.Do(func() {
+		o := Options{
+			Log: log.NewOptions(),
+		}
+
+		OptInstance = &o
+	})
+
+	return OptInstance
+}
+
+// Validate 统一验证...
+func (o *Options) Validate() []error {
+	var errs []error
+	errs = append(errs, o.Log.Validate()...)
+
+	return errs
+}

+ 9 - 0
internal/pkg/common/options/bzd.go

@@ -0,0 +1,9 @@
+package options
+
+type BzdOption struct {
+	Host                string `json:"host" mapstructure:"host"`
+	DataListUrl         string `json:"dataListUrl"  mapstructure:"dataListUrl"`
+	DeviceSensorList    string `json:"deviceSensorList" mapstructure:"deviceSensorList"`
+	UserList            string `json:"userList"  mapstructure:"userList"`
+	LogisticCompanyList string `json:"logisticCompanyList" mapstructure:"logisticCompanyList"`
+}

+ 22 - 0
internal/pkg/common/options/nats.go

@@ -0,0 +1,22 @@
+package options
+
+import (
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"github.com/nats-io/nats.go"
+)
+
+type NatsOption struct {
+	Enable bool   `json:"enable" mapstructure:"enable"`
+	Url    string `json:"url" mapstructure:"url"`
+}
+
+func InitNats(natsOption NatsOption) *nats.Conn {
+	if !natsOption.Enable {
+		return nil
+	}
+	conn, err := nats.Connect("nats://" + natsOption.Url)
+	if err != nil {
+		log.Panicf("初始化NATS失败:%s", err)
+	}
+	return conn
+}

+ 7 - 0
internal/pkg/common/options/wechat.go

@@ -0,0 +1,7 @@
+package options
+
+type WechatOption struct {
+	AppId       string `json:"appId" mapstructure:"appId"`
+	AppSecret   string `json:"appSecret" mapstructure:"appSecret"`
+	RedirectUri string `json:"redirectUri" mapstructure:"redirectUri"`
+}

+ 5 - 0
internal/pkg/doc.go

@@ -0,0 +1,5 @@
+package pkg
+
+/*
+项目内多个应用程序可以使用的公共库代码。
+*/

+ 18 - 0
internal/pkg/utils/contextutil/ctx_trace.go

@@ -0,0 +1,18 @@
+package contextutil
+
+import (
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/consts"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+
+	"github.com/google/uuid"
+)
+
+func MakeTraceCtx(ctx context.Context, keysAndValues ...interface{}) context.Context {
+	requestId := uuid.NewString()
+	ctx = context.WithValue(ctx, consts.TraceIDHeader, requestId)
+	keysAndValues = append([]interface{}{consts.TraceIDHeader, requestId}, keysAndValues...)
+	ctxLog := log.WithValues(keysAndValues...)
+	ctx = context.WithValue(ctx, log.GetContextKey(), ctxLog)
+	return ctx
+}

+ 64 - 0
internal/pkg/utils/excelizeutil/excel.go

@@ -0,0 +1,64 @@
+package excelizeutil
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"context"
+	"github.com/xuri/excelize/v2"
+	"io"
+	"strings"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/goroutineutil"
+)
+
+type CheckFunc func(*excelize.File) error
+
+func CheckFileFormat(file *excelize.File, titles []string, titleRow, titleCel int, opts ...CheckFunc) error {
+	sheet := file.GetSheetName(file.GetActiveSheetIndex())
+	rows, err := file.GetRows(sheet)
+	if err != nil {
+		return errors.WithStack(err)
+	}
+
+	if len(rows) < 1 || len(rows[titleRow])-titleCel < len(titles) {
+		return errors.WithCode(codex.ErrParamValidate, "文件标题头不匹配")
+	}
+
+	if len(rows) < 2 {
+		return errors.WithCode(codex.ErrParamValidate, "导入文件内容为空")
+	}
+
+	// 校验表头
+	for k, v := range titles {
+		title := strings.TrimSpace(rows[titleRow][k+titleCel])
+		if title != v {
+			return errors.WithCode(codex.ErrParamValidate, "文件标题头不匹配")
+		}
+	}
+
+	for _, o := range opts {
+		if err = o(file); err != nil {
+			return errors.WithStackOnce(err)
+		}
+	}
+
+	return nil
+}
+
+func PutFile(ctx context.Context, keyPath string, file *excelize.File) (string, error) {
+	// 更新结果上传至cos
+	piper, pipeW := io.Pipe()
+	defer piper.Close()
+	goroutineutil.SafeGoWithCtx(ctx, func(c context.Context) {
+		defer pipeW.Close()
+		file.Write(pipeW)
+	})
+
+	oss := global.CommonConnectRepoInst.ObjectStore
+	err := oss.PutObject(ctx, keyPath, piper)
+	if err != nil {
+		return "", errors.WithStackOnce(err)
+	}
+	return oss.GetDownLoadUrl(ctx, keyPath)
+}

+ 212 - 0
internal/pkg/utils/excelutil/create.go

@@ -0,0 +1,212 @@
+package excelutil
+
+import (
+	"bytes"
+	"context"
+	"fmt"
+	"github.com/xuri/excelize/v2"
+	"io"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+func ExportExcel(ctx context.Context, titles []interface{}, values [][]interface{}, cellFunc ExcelCellOptionFunc, opts ...ExcelOptionFunc) (io.Reader, error) {
+	if len(titles) == 0 {
+		return nil, errors.New("表头为空")
+	}
+
+	file := excelize.NewFile()
+	defer func() {
+		if err := file.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	streamWriter, err := file.NewStreamWriter("Sheet1")
+	if err != nil {
+		return nil, errors.WithStack(err)
+	}
+	for _, opt := range opts {
+		if err = opt(file, streamWriter); err != nil {
+			return nil, err
+		}
+	}
+
+	// 写入标题
+	titleStyleID, err := getDefaultTitleStyleId(file)
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+	for i, v := range titles {
+		cell := excelize.Cell{}
+		if val, ok := v.(excelize.Cell); ok {
+			cell = val
+		} else {
+			cell = excelize.Cell{StyleID: titleStyleID, Value: v}
+		}
+		if cellFunc != nil {
+			if err = cellFunc(0, i, &cell); err != nil {
+				return nil, errors.WithStack(err)
+			}
+		}
+		titles[i] = cell
+	}
+	if err = streamWriter.SetRow("A1", titles, excelize.RowOpts{Height: 20}); err != nil {
+		return nil, errors.WithStack(err)
+	}
+
+	// 写入内容
+	valueStyleID, err := GetDefaultValueStyleId(file)
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+	timeStyleID, err := getDefaultTimeStyleId(file)
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+
+	for rowID := 0; rowID < len(values); rowID++ {
+		row := values[rowID]
+
+		for i, v := range row {
+			cell := excelize.Cell{}
+			if val, ok := v.(excelize.Cell); ok {
+				cell = val
+			} else if _, ok := v.(time.Time); ok {
+				cell = excelize.Cell{StyleID: timeStyleID, Value: v}
+			} else {
+				cell = excelize.Cell{StyleID: valueStyleID, Value: v}
+			}
+			if cellFunc != nil {
+				if err = cellFunc(rowID+1, i, &cell); err != nil {
+					return nil, errors.WithStack(err)
+				}
+			}
+			row[i] = cell
+		}
+
+		cell, _ := excelize.CoordinatesToCellName(1, rowID+2)
+		if err := streamWriter.SetRow(cell, row); err != nil {
+			return nil, errors.WithStack(err)
+		}
+	}
+
+	if err := streamWriter.Flush(); err != nil {
+		return nil, errors.WithStack(err)
+	}
+
+	buf := bytes.NewBuffer([]byte{})
+	if err = file.Write(buf); err != nil {
+		return nil, errors.WithStack(err)
+	}
+
+	return buf, nil
+}
+
+func getDefaultTitleStyleId(file *excelize.File) (int, error) {
+	styleID, err := file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "FFFFFF",
+		},
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 图案填充-绿色
+		Fill: excelize.Fill{
+			Pattern: 1,
+			Type:    "pattern",
+			Color:   []string{"2EA121"},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+	})
+	return styleID, err
+}
+
+func GetYellowStyleId(file *excelize.File) (int, error) {
+	styleID, err := file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "FFFFFF",
+		},
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 图案填充-黄色
+		Fill: excelize.Fill{
+			Pattern: 1,
+			Type:    "pattern",
+			Color:   []string{"FFC60A"},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+	})
+	return styleID, err
+}
+
+func GetDefaultValueStyleId(file *excelize.File) (int, error) {
+	styleID, err := file.NewStyle(&excelize.Style{
+		// 设置边框
+		//Border: []excelize.Border{
+		//	{Type: "left", Color: "000000", Style: 1},
+		//	{Type: "top", Color: "000000", Style: 1},
+		//	{Type: "bottom", Color: "000000", Style: 1},
+		//	{Type: "right", Color: "000000", Style: 1},
+		//},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+	})
+	return styleID, err
+}
+
+func getDefaultTimeStyleId(file *excelize.File) (int, error) {
+	styleID, err := file.NewStyle(&excelize.Style{
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+		NumFmt: 22,
+	})
+	return styleID, err
+}
+
+type ExcelOptionFunc func(*excelize.File, *excelize.StreamWriter) error
+
+type ExcelCellOptionFunc func(rowIndex, cellIndex int, cell *excelize.Cell) error

+ 32 - 0
internal/pkg/utils/excelutil/create_test.go

@@ -0,0 +1,32 @@
+package excelutil
+
+import (
+	"context"
+	"github.com/xuri/excelize/v2"
+	"testing"
+)
+
+func TestExportExcel(t *testing.T) {
+	titles := []interface{}{"学员名称", "学员手机号码"}
+	values := make([][]interface{}, 0)
+	values = append(values, []interface{}{
+		"张三",
+		"1231987",
+	})
+
+	if _, err := ExportExcel(context.Background(), titles, values, withExcelCellOption()); err != nil {
+		t.Errorf("ExportExcel() error = %v", err)
+	}
+
+}
+
+var sliceNameTitleStyleId = 0
+
+func withExcelCellOption() ExcelCellOptionFunc {
+	return func(rowIndex, cellIndex int, cell *excelize.Cell) error {
+		if rowIndex == 0 && cellIndex == 1 {
+			cell.StyleID = sliceNameTitleStyleId
+		}
+		return nil
+	}
+}

+ 194 - 0
internal/pkg/utils/excelutil/style.go

@@ -0,0 +1,194 @@
+package excelutil
+
+import "github.com/xuri/excelize/v2"
+
+type style struct {
+	file *excelize.File
+}
+
+func NewStyle(file *excelize.File) *style {
+	return &style{
+		file: file,
+	}
+}
+
+func (s *style) NewBoldTitleStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "000000",
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+			// 单元格内容过多则自动换行
+			WrapText: true,
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewBoldBorderTitleStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "000000",
+		},
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+			// 单元格内容过多则自动换行
+			WrapText: true,
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewGreenBoldBorderTitleStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "FFFFFF",
+		},
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 图案填充-绿色
+		Fill: excelize.Fill{
+			Pattern: 1,
+			Type:    "pattern",
+			Color:   []string{"2EA121"},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+			// 单元格内容过多则自动换行
+			WrapText: true,
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewYellowBoldBorderTitleStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 标题加粗
+		Font: &excelize.Font{
+			Bold:  true,
+			Color: "FFFFFF",
+		},
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 图案填充-黄色
+		Fill: excelize.Fill{
+			Pattern: 1,
+			Type:    "pattern",
+			Color:   []string{"FFC60A"},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+			// 单元格内容过多则自动换行
+			WrapText: true,
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewDefaultValueStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewDefaultValueStyleIdWithBorder() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+	})
+	return styleID, err
+}
+
+func (s *style) NewDefaultTimeStyleId() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+		NumFmt: 22,
+	})
+	return styleID, err
+}
+
+func (s *style) NewDefaultTimeStyleIdWithBorder() (int, error) {
+	styleID, err := s.file.NewStyle(&excelize.Style{
+		// 设置边框
+		Border: []excelize.Border{
+			{Type: "left", Color: "000000", Style: 1},
+			{Type: "top", Color: "000000", Style: 1},
+			{Type: "bottom", Color: "000000", Style: 1},
+			{Type: "right", Color: "000000", Style: 1},
+		},
+		// 居中
+		Alignment: &excelize.Alignment{
+			// 水平对齐:
+			Horizontal: "center",
+			// 垂直对齐
+			Vertical: "center",
+		},
+		NumFmt: 22,
+	})
+	return styleID, err
+}

+ 165 - 0
internal/pkg/utils/excelutil/writer.go

@@ -0,0 +1,165 @@
+package excelutil
+
+import (
+	"context"
+	"github.com/xuri/excelize/v2"
+	"os"
+	"path/filepath"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+type DynamicWriteSheet struct {
+	File                *excelize.File
+	StreamWriter        *excelize.StreamWriter
+	Style               *style
+	DefaultTitleStyleId int
+	DefaultValueStyleId int
+	DefaultTimeStyleId  int
+	SaveFilePath        string
+	SheetName           string
+}
+
+type (
+	DynamicWriteSheetFun    func(*DynamicWriteSheet) error
+	DynamicPreWriteSheetFun func(*DynamicWriteSheet) error
+)
+
+func WithDynamicWriteSheetSaveFilePath(saveFilePath string) DynamicWriteSheetFun {
+	return func(writer *DynamicWriteSheet) error {
+		writer.SaveFilePath = saveFilePath
+		return nil
+	}
+}
+
+func WithDynamicWriteSheetName(sheetName string) DynamicWriteSheetFun {
+	return func(writer *DynamicWriteSheet) error {
+		writer.SheetName = sheetName
+		return nil
+	}
+}
+
+func NewDynamicWriteSheet(opts ...DynamicWriteSheetFun) (writer *DynamicWriteSheet, err error) {
+	writer = &DynamicWriteSheet{
+		File:      excelize.NewFile(),
+		SheetName: "Sheet1",
+	}
+	writer.Style = NewStyle(writer.File)
+	writer.DefaultTitleStyleId, err = writer.Style.NewBoldTitleStyleId()
+	if err != nil {
+		return nil, err
+	}
+	writer.DefaultValueStyleId, err = writer.Style.NewDefaultValueStyleId()
+	if err != nil {
+		return nil, err
+	}
+	writer.DefaultTimeStyleId, err = writer.Style.NewDefaultTimeStyleId()
+	if err != nil {
+		return nil, err
+	}
+	for _, opt := range opts {
+		if err = opt(writer); err != nil {
+			return nil, err
+		}
+	}
+	writer.StreamWriter, err = writer.File.NewStreamWriter(writer.SheetName)
+	if err != nil {
+		return nil, err
+	}
+	return writer, nil
+}
+
+func (w *DynamicWriteSheet) PreWrite(_ context.Context, opts ...DynamicPreWriteSheetFun) error {
+	for _, opt := range opts {
+		if err := opt(w); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// WriteToFile 将标题内容写入到文件
+func (w *DynamicWriteSheet) WriteToFile(ctx context.Context, titles, contents [][]interface{}) error {
+	if len(w.SaveFilePath) == 0 {
+		return errors.New("SaveFilePath is empty")
+	}
+	err := w.WriteTitle(ctx, 0, titles)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	err = w.WriteContent(ctx, len(titles), contents)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	return w.FlushToFile()
+}
+
+// WriteToBuff 将标题内容写入到 *excelize.File 缓存中
+func (w *DynamicWriteSheet) WriteToBuff(ctx context.Context, titles, contents [][]interface{}) error {
+	err := w.WriteTitle(ctx, 0, titles)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	err = w.WriteContent(ctx, len(titles), contents)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	return w.Flush()
+}
+
+func (w *DynamicWriteSheet) WriteTitle(ctx context.Context, startRow int, titles [][]interface{}) error {
+	return w.Write(ctx, startRow, titles, w.DefaultTitleStyleId)
+}
+
+func (w *DynamicWriteSheet) WriteContent(ctx context.Context, startRow int, contents [][]interface{}) error {
+	return w.Write(ctx, startRow, contents, w.DefaultValueStyleId)
+}
+
+func (w *DynamicWriteSheet) Write(_ context.Context, startRow int, values [][]interface{}, styleId int) (err error) {
+	for rowID := 0; rowID < len(values); rowID++ {
+		row := values[rowID]
+		for i, v := range row {
+			cell := excelize.Cell{}
+			if val, ok := v.(excelize.Cell); ok {
+				cell = val
+			} else if _, ok := v.(time.Time); ok {
+				cell = excelize.Cell{StyleID: w.DefaultTimeStyleId, Value: v}
+			} else {
+				cell = excelize.Cell{StyleID: styleId, Value: v}
+			}
+			row[i] = cell
+		}
+		cell, _ := excelize.CoordinatesToCellName(1, rowID+startRow+1)
+		if err := w.StreamWriter.SetRow(cell, row); err != nil {
+			return errors.WithStack(err)
+		}
+	}
+	return nil
+}
+
+func (w *DynamicWriteSheet) Flush() error {
+	return w.StreamWriter.Flush()
+}
+
+func (w *DynamicWriteSheet) FlushToFile() error {
+	if len(w.SaveFilePath) == 0 {
+		return errors.New("SaveFilePath is empty")
+	}
+	err := w.StreamWriter.Flush()
+	if err != nil {
+		return err
+	}
+	err = os.MkdirAll(filepath.Dir(w.SaveFilePath), os.ModePerm)
+	if err != nil {
+		return err
+	}
+	return w.File.SaveAs(w.SaveFilePath)
+}
+
+func (w *DynamicWriteSheet) Close() error {
+	if w.File != nil {
+		return w.File.Close()
+	}
+	return nil
+}

+ 35 - 0
internal/pkg/utils/headutil/auth.go

@@ -0,0 +1,35 @@
+package headutil
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"encoding/base64"
+	"strings"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/sliceutil"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+// ParseAuthHead 解析请求头中Authorization,返回tokenType, Token
+func ParseAuthHead(c *gin.Context) (tokenType, token string, e error) {
+	authHeader := strings.SplitN(c.Request.Header.Get(constant.Authorization), " ", 2)
+	if len(authHeader) != 2 || authHeader[1] == "" || !sliceutil.ContainStr([]string{constant.AuthTokenTypeBasic, constant.AuthTokenTypeBearer}, authHeader[0]) {
+		return "", "", errors.New("Authorization header format is wrong")
+	}
+	return authHeader[0], authHeader[1], nil
+}
+
+// ParseBasicToken 解析BasicToken,返回账号, 密码
+func ParseBasicToken(token string) (username, password string, err error) {
+	payload, err := base64.StdEncoding.DecodeString(token)
+	if err != nil {
+		return "", "", err
+	}
+
+	pair := strings.SplitN(string(payload), ":", 2)
+	if len(pair) != 2 {
+		return "", "", errors.New("Parse Basic Payload Error")
+	}
+	return pair[0], pair[1], nil
+}

+ 135 - 0
internal/pkg/utils/signutil/ibingli_digest.go

@@ -0,0 +1,135 @@
+package signutil
+
+import (
+	"crypto/sha1"
+	"encoding/hex"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+const (
+	AppidKey     = "appid"
+	NoncestrKey  = "noncestr"
+	TimestampKey = "timestamp"
+	SignKey      = "sign"
+)
+
+type GenSignFunc func(appid, secret, nonceStr, timestamp string) string
+
+type IBINGLIDigest struct {
+	AppId       string
+	NonceStr    string
+	Timestamp   string
+	Sign        string
+	TimeLimit   time.Duration
+	genSignFunc GenSignFunc
+}
+
+type IBINGLIDigestOpt func(d *IBINGLIDigest)
+
+func WithIBINGLIDigestTimeLimit(t time.Duration) IBINGLIDigestOpt {
+	return func(d *IBINGLIDigest) {
+		d.TimeLimit = t
+	}
+}
+
+func WithIBINGLIDigestGenSignFunc(f GenSignFunc) IBINGLIDigestOpt {
+	return func(d *IBINGLIDigest) {
+		d.genSignFunc = f
+	}
+}
+
+func NewIBINGLIDigestByParam(param map[string]string, opts ...IBINGLIDigestOpt) *IBINGLIDigest {
+	d := &IBINGLIDigest{
+		AppId:       param[AppidKey],
+		NonceStr:    param[NoncestrKey],
+		Timestamp:   param[TimestampKey],
+		Sign:        param[SignKey],
+		genSignFunc: defaultGenSign,
+	}
+
+	for _, opt := range opts {
+		opt(d)
+	}
+
+	return d
+}
+
+func NewIBINGLIDigest(appId, nonceStr, timestamp, sign string, opts ...IBINGLIDigestOpt) *IBINGLIDigest {
+	d := &IBINGLIDigest{
+		AppId:       appId,
+		NonceStr:    nonceStr,
+		Timestamp:   timestamp,
+		Sign:        sign,
+		genSignFunc: defaultGenSign,
+	}
+
+	for _, opt := range opts {
+		opt(d)
+	}
+
+	return d
+}
+
+func (v *IBINGLIDigest) Validate() error {
+	err := validation.ValidateStruct(v,
+		validation.Field(&v.AppId, validation.Required),
+		validation.Field(&v.NonceStr, validation.Required),
+		validation.Field(&v.Timestamp, validation.Required),
+		validation.Field(&v.Sign, validation.Required),
+	)
+	if err != nil {
+		return err
+	}
+	if v.TimeLimit > 0 {
+		return v.ValidateTimestamp()
+	}
+	return nil
+}
+
+// 验证时效性
+func (v *IBINGLIDigest) ValidateTimestamp() error {
+	ts, err := strconv.Atoi(v.Timestamp)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	if time.Now().Sub(time.UnixMilli(int64(ts))) > v.TimeLimit {
+		return errors.New("timestamp invalid")
+	}
+	return nil
+}
+
+func defaultGenSign(appid, secret, nonceStr, timestamp string) string {
+	// /*
+	// 	  签名规则:
+	// 	     1. 拼接appid和secret字符串
+	// 	     2. 随机生成一个16位字符串,由[0~9a~zA~Z]组成
+	// 	     3. 使用当前13位时间戳(毫秒值)
+	// 	     4. 拼接123中的字符串
+	// 	     5. 字典排序4中的字符串
+	// 	     6. 计算字符串的SHA1校验和
+	// 	*/
+	target := appid + secret + nonceStr + timestamp
+	targetStrArray := strings.Split(target, "")
+	sort.Strings(targetStrArray)
+	target = strings.Join(targetStrArray, "")
+	h := sha1.New()
+	h.Write([]byte(target))
+	sum := h.Sum(nil)
+	return hex.EncodeToString(sum)
+}
+
+// 生成签名
+func (v *IBINGLIDigest) GenSign(secret string) string {
+	return v.genSignFunc(v.AppId, secret, v.NonceStr, v.Timestamp)
+}
+
+// 比较签名
+func (v *IBINGLIDigest) CompareSign(secret string) bool {
+	return v.Sign == v.GenSign(secret)
+}

+ 183 - 0
internal/pkg/utils/signutil/ibingli_digest_test.go

@@ -0,0 +1,183 @@
+package signutil
+
+import (
+	"strconv"
+	"testing"
+	"time"
+)
+
+func TestIBINGLIDigest_Validate(t *testing.T) {
+	type fields struct {
+		AppId       string
+		NonceStr    string
+		Timestamp   string
+		Sign        string
+		TimeLimit   time.Duration
+		genSignFunc GenSignFunc
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		wantErr bool
+	}{
+		{
+			name:    "lack of field",
+			fields:  fields{AppId: "123", NonceStr: "", Timestamp: "134134", Sign: ""},
+			wantErr: true,
+		},
+		{
+			name:    "has field",
+			fields:  fields{AppId: "123", NonceStr: "123", Timestamp: "134134", Sign: "123"},
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			v := &IBINGLIDigest{
+				AppId:       tt.fields.AppId,
+				NonceStr:    tt.fields.NonceStr,
+				Timestamp:   tt.fields.Timestamp,
+				Sign:        tt.fields.Sign,
+				TimeLimit:   tt.fields.TimeLimit,
+				genSignFunc: tt.fields.genSignFunc,
+			}
+			if err := v.Validate(); (err != nil) != tt.wantErr {
+				t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestIBINGLIDigest_ValidateTimestamp(t *testing.T) {
+	type fields struct {
+		AppId       string
+		NonceStr    string
+		Timestamp   string
+		Sign        string
+		TimeLimit   time.Duration
+		genSignFunc GenSignFunc
+	}
+	tests := []struct {
+		name    string
+		fields  fields
+		wantErr bool
+	}{
+		{
+			name:    "correct time",
+			fields:  fields{Timestamp: strconv.Itoa(int(time.Now().UnixMilli())), TimeLimit: time.Hour},
+			wantErr: false,
+		},
+		{
+			name:    "error time",
+			fields:  fields{Timestamp: strconv.Itoa(int(time.Now().Add(-2 * time.Hour).UnixMilli())), TimeLimit: time.Hour},
+			wantErr: true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			v := &IBINGLIDigest{
+				AppId:       tt.fields.AppId,
+				NonceStr:    tt.fields.NonceStr,
+				Timestamp:   tt.fields.Timestamp,
+				Sign:        tt.fields.Sign,
+				TimeLimit:   tt.fields.TimeLimit,
+				genSignFunc: tt.fields.genSignFunc,
+			}
+			if err := v.ValidateTimestamp(); (err != nil) != tt.wantErr {
+				t.Errorf("ValidateTimestamp() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+
+func TestIBINGLIDigest_GenSign(t *testing.T) {
+	type fields struct {
+		AppId       string
+		NonceStr    string
+		Timestamp   string
+		Sign        string
+		TimeLimit   time.Duration
+		genSignFunc GenSignFunc
+	}
+	type args struct {
+		secret string
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		args   args
+		want   string
+	}{
+		{
+			name:   "correct sign",
+			fields: fields{AppId: "cc38c5ac086a3fc5", NonceStr: "d5f7d8x5z6ds9F8c", Timestamp: "1558507701959", genSignFunc: defaultGenSign},
+			want:   "ffe6d0b60c2b1585df653ddaf92e7104745e3a83",
+			args:   args{secret: "9c4759cb2b897722"},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			v := &IBINGLIDigest{
+				AppId:       tt.fields.AppId,
+				NonceStr:    tt.fields.NonceStr,
+				Timestamp:   tt.fields.Timestamp,
+				Sign:        tt.fields.Sign,
+				TimeLimit:   tt.fields.TimeLimit,
+				genSignFunc: tt.fields.genSignFunc,
+			}
+			got := v.GenSign(tt.args.secret)
+			if got != tt.want {
+				t.Errorf("GenSign() = %v, want %v", got, tt.want)
+			}
+			t.Logf("got: %v", got)
+		})
+	}
+}
+
+func TestIBINGLIDigest_CompareSign(t *testing.T) {
+	type fields struct {
+		AppId       string
+		NonceStr    string
+		Timestamp   string
+		Sign        string
+		TimeLimit   time.Duration
+		genSignFunc GenSignFunc
+	}
+	type args struct {
+		secret string
+	}
+	tests := []struct {
+		name   string
+		fields fields
+		args   args
+		want   bool
+	}{
+		{
+			name:   "correct secret",
+			fields: fields{AppId: "cc38c5ac086a3fc5", NonceStr: "d5f7d8x5z6ds9F8c", Timestamp: "1558507701959", Sign: "ffe6d0b60c2b1585df653ddaf92e7104745e3a83", genSignFunc: defaultGenSign},
+			want:   true,
+			args:   args{secret: "9c4759cb2b897722"},
+		},
+		{
+			name:   "incorrect secret",
+			fields: fields{AppId: "cc38c5ac086a3fc5", NonceStr: "d5f7d8x5z6ds9F8c", Timestamp: "1558507701959", Sign: "ffe6d0b60c2b1585df653ddaf92e7104745e3a83", genSignFunc: defaultGenSign},
+			want:   false,
+			args:   args{secret: "9c4759cb2b89772"},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			v := &IBINGLIDigest{
+				AppId:       tt.fields.AppId,
+				NonceStr:    tt.fields.NonceStr,
+				Timestamp:   tt.fields.Timestamp,
+				Sign:        tt.fields.Sign,
+				TimeLimit:   tt.fields.TimeLimit,
+				genSignFunc: tt.fields.genSignFunc,
+			}
+			if got := v.CompareSign(tt.args.secret); got != tt.want {
+				t.Errorf("CompareSign() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}

+ 40 - 0
internal/pkg/utils/sqlutil/sql.go

@@ -0,0 +1,40 @@
+package sqlutil
+
+import (
+	"bytes"
+	"fmt"
+	"strings"
+)
+
+var escapeArray = []string{"\\", "%"}
+
+func LikeFormat(name string) string {
+	return "%" + escape(name) + "%"
+}
+
+func LeftLikeFormat(name string) string {
+	return "%" + escape(name)
+}
+
+func RightLikeFormat(name string) string {
+	return escape(name) + "%"
+}
+
+func escape(name string) string {
+	for i := range escapeArray {
+		name = strings.ReplaceAll(name, escapeArray[i], "\\"+escapeArray[i])
+	}
+	return name
+}
+
+func OrderByFieldInt(column string, arg ...int) string {
+	of := bytes.NewBufferString("FIELD(" + column + ", ")
+	for i := range arg {
+		if i < len(arg)-1 {
+			of.WriteString(fmt.Sprintf("%v, ", arg[i]))
+		} else {
+			of.WriteString(fmt.Sprintf("%v) ", arg[i]))
+		}
+	}
+	return of.String()
+}

+ 44 - 0
internal/pkg/utils/stringutil/path.go

@@ -0,0 +1,44 @@
+package stringutil
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/options"
+	"path"
+	"strconv"
+	"strings"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/fileutil"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/idutil"
+)
+
+func GenUploadKeyPath(fileName string) (keyPath string) {
+	return path.Join(options.OptInstance.Storage.ProjectPrefixPath, constant.UploadPath, fileutil.GenYYYYMMDDPath(), strconv.FormatUint(idutil.GetIntID(), 10), fileName)
+}
+
+func GenUploadBasePath(suffix string) string {
+	return path.Join(options.OptInstance.Storage.ProjectPrefixPath, constant.UploadPath, suffix)
+}
+
+func GenExportBasePath(suffix string) string {
+	return path.Join(options.OptInstance.Storage.ProjectPrefixPath, constant.ExportPath, suffix)
+}
+
+func GenUploadKeyPathWithCategory(fileCategory, fileName string) (keyPath string) {
+	fileCategory = strings.TrimSpace(fileCategory)
+	if len(fileCategory) == 0 {
+		return GenUploadKeyPath(fileName)
+	}
+	return path.Join(options.OptInstance.Storage.ProjectPrefixPath, constant.UploadPath, fileCategory, fileutil.GenYYYYMMDDPath(), strconv.FormatUint(idutil.GetIntID(), 10), fileName)
+}
+
+func GenExcelKeyPath(fileName string) (keyPath string) {
+	return path.Join(options.OptInstance.Storage.ProjectPrefixPath, constant.ExcelPath, fileutil.GenYYYYMMDDPath(), strconv.FormatUint(idutil.GetIntID(), 10), fileName)
+}
+
+func GenLocalUploadPath(fileName string) (keyPath string) {
+	return path.Join(options.OptInstance.Storage.LocalStorageOptions.RootFilePath, fileutil.GenYYYYMMDDPath(), strconv.FormatUint(idutil.GetIntID(), 10), fileName)
+}
+
+func GenLocalExportPath(fileCategory, fileName string) (keyPath string) {
+	return path.Join(options.OptInstance.Storage.LocalStorageOptions.RootFilePath, constant.ExportPath, fileCategory, fileutil.GenYYYYMMDDPath(), strconv.FormatUint(idutil.GetIntID(), 10), fileName)
+}

+ 89 - 0
internal/pkg/utils/stringutil/pinyin.go

@@ -0,0 +1,89 @@
+package stringutil
+
+import (
+	"strings"
+
+	"github.com/mozillazg/go-pinyin"
+)
+
+// ZhToPinyin 中文转拼音
+func ZhToPinyin(zh, sep string) string {
+	args := pinyin.NewArgs()
+	p := pinyin.Pinyin(zh, args)
+
+	names := make([]string, 0, len(p))
+	for _, v := range p {
+		if len(v) > 0 {
+			if len(v) == 1 {
+				names = append(names, v[0])
+			} else {
+				names = append(names, strings.Join(v, ""))
+			}
+		}
+	}
+
+	return strings.Join(names, sep)
+}
+
+type CamelType int
+
+const (
+	CamelSmall CamelType = 1 // a_bc aBc
+	CamelBig   CamelType = 2 // a_bc ABc
+)
+
+// CamelToSnake 驼峰转蛇形
+func CamelToSnake(s string) string {
+	data := make([]byte, 0, len(s)*2)
+	j := false
+	num := len(s)
+	for i := 0; i < num; i++ {
+		d := s[i]
+		// or通过ASCII码进行大小写的转化
+		// 65-90(A-Z),97-122(a-z)
+		// 判断如果字母为大写的A-Z就在前面拼接一个_
+		if i > 0 && d >= 'A' && d <= 'Z' && j {
+			data = append(data, '_')
+		}
+		if d != '_' {
+			j = true
+		}
+		data = append(data, d)
+	}
+	// ToLower把大写字母统一转小写
+	return strings.ToLower(string(data[:]))
+}
+
+// SnakeToCamel 蛇形转驼峰 a_b to AB
+func SnakeToCamel(s string, camel CamelType) string {
+	data := make([]byte, 0, len(s))
+	j := false
+	k := false
+	num := len(s) - 1
+	for i := 0; i <= num; i++ {
+		d := s[i]
+		if k == false && d >= 'A' && d <= 'Z' {
+			k = true
+		}
+		if d >= 'a' && d <= 'z' && (j || k == false) {
+			d = d - 32
+			j = false
+			k = true
+		}
+		if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
+			j = true
+			continue
+		}
+		data = append(data, d)
+	}
+
+	str := string(data[:])
+	switch camel {
+	case CamelSmall:
+		return strings.ToLower(str[0:1]) + str[1:]
+	case CamelBig:
+		return str
+	default:
+		return str
+	}
+}

+ 42 - 0
internal/pkg/utils/stringutil/pinyin_test.go

@@ -0,0 +1,42 @@
+package stringutil
+
+import (
+	"regexp"
+	"testing"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/authutil"
+	"github.com/dlclark/regexp2"
+)
+
+func TestZhToPinyin(t *testing.T) {
+	zh := "隐私级别1"
+	l := []rune(zh)
+	t.Logf("l %v", string(l[0:2]))
+	sep := "_"
+	got := ZhToPinyin(zh, sep)
+
+	t.Logf("got: %v", SnakeToCamel(got, CamelSmall))
+}
+
+func TestCamelToSnake(t *testing.T) {
+	got := CamelToSnake("AsdFert")
+	t.Logf("got: %v", got)
+}
+
+func TestSnakeToCamel(t *testing.T) {
+	p, _ := authutil.Encrypt("123123")
+	t.Logf("密码:%s", p)
+	t.Logf(time.UnixMilli(1678679758000).String())
+}
+
+func TestSnake(t *testing.T) {
+	str := "wq1234"
+	matched, _ := regexp.MatchString("^(?:.*\\d)(?:.*[a-zA-Z])[0-9a-zA-Z]*$", str)
+	t.Logf("ret1: %v", matched)
+	matched, _ = regexp.MatchString("^(.*\\d)(.*[a-zA-Z])[0-9a-zA-Z]*$", str)
+	t.Logf("ret2: %v", matched)
+	reg, _ := regexp2.Compile(`^((?=.*[0-9])(?=.*[a-zA-Z]).{6,50})$`, 0)
+	matched, _ = reg.MatchString(str)
+	t.Logf("ret3: %v", matched)
+}

+ 74 - 0
internal/pkg/utils/timeutil/time.go

@@ -0,0 +1,74 @@
+package timeutil
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+	"time"
+)
+
+func Parse(timeStrInput string) (res time.Time, err error) {
+	if len(timeStrInput) > 0 {
+		timeStr := strings.ReplaceAll(timeStrInput, "/", "")
+		timeStr = strings.ReplaceAll(timeStr, "-", "")
+		if len(timeStr) == 8 {
+			res, err = time.Parse("20060102", timeStr)
+		} else if len(timeStr) == 11 {
+			res, err = time.Parse("20060102 15", timeStr)
+		} else if len(timeStr) == 14 {
+			res, err = time.Parse("20060102 15:04", timeStr)
+		} else if len(timeStr) == 17 {
+			res, err = time.Parse("20060102 15:04:05", timeStr)
+		} else if len(timeStr) == 21 {
+			res, err = time.Parse("20060102 15:04:05.000", timeStr)
+		} else {
+			err = errors.New("bad value for timeStr")
+		}
+		if err != nil {
+			timeStr = strings.ReplaceAll(timeStrInput, "-", "/")
+			if len(timeStr) == 8 {
+				res, err = time.Parse("2006/1/2", timeStr)
+			} else if len(timeStr) == 9 {
+				res, err = time.Parse("2006/01/2", timeStr)
+				if err != nil {
+					res, err = time.Parse("2006/1/02", timeStr)
+				}
+			} else if len(timeStr) == 11 {
+				res, err = time.Parse("2006/1/2 15", timeStr)
+			} else if len(timeStr) == 12 {
+				res, err = time.Parse("2006/01/2 15", timeStr)
+				if err != nil {
+					res, err = time.Parse("2006/1/02 15", timeStr)
+				}
+			} else if len(timeStr) == 14 {
+				res, err = time.Parse("2006/1/2 15:04", timeStr)
+			} else if len(timeStr) == 15 {
+				res, err = time.Parse("2006/1/02 15:04", timeStr)
+				if err != nil {
+					res, err = time.Parse("2006/01/2 15:04", timeStr)
+				}
+			} else if len(timeStr) == 17 {
+				res, err = time.Parse("2006/1/2 15:04:05", timeStr)
+			} else if len(timeStr) == 18 {
+				res, err = time.Parse("2006/1/02 15:04:05", timeStr)
+				if err != nil {
+					res, err = time.Parse("2006/01/2 15:04:05", timeStr)
+				}
+			}
+		}
+	}
+	return res, err
+}
+
+func SecondsToTime(seconds int) string {
+	if seconds <= 0 {
+		return "00:00:00"
+	}
+	hours := seconds / 3600
+	seconds = seconds % 3600
+
+	minutes := seconds / 60
+	seconds = seconds % 60
+
+	return fmt.Sprintf("%02d:%02d:%02d", hours, minutes, seconds)
+}

+ 15 - 0
internal/pkg/utils/timeutil/time_test.go

@@ -0,0 +1,15 @@
+package timeutil
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestSecondsToTime(t *testing.T) {
+	assert.Equal(t, "00:00:12", SecondsToTime(12))
+	assert.Equal(t, "00:01:00", SecondsToTime(60))
+	assert.Equal(t, "00:30:00", SecondsToTime(1800))
+	assert.Equal(t, "01:00:01", SecondsToTime(3601))
+	assert.Equal(t, "01:30:01", SecondsToTime(5401))
+}

+ 50 - 0
internal/server/adapter/adapter.go

@@ -0,0 +1,50 @@
+package adapter
+
+import (
+	"Cold_Logistic/internal/server/adapter/http/v1/common"
+	"Cold_Logistic/internal/server/adapter/http/v1/insider"
+	"Cold_Logistic/internal/server/adapter/http/v1/manage"
+	"Cold_Logistic/internal/server/adapter/http/v1/myself"
+	"Cold_Logistic/internal/server/adapter/http/v1/public"
+	"Cold_Logistic/internal/server/adapter/job/ordercron"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/watcher"
+
+	"github.com/gin-gonic/gin"
+
+	"Cold_Logistic/internal/server/adapter/http/v1/auth"
+)
+
+func HttpRoutes() func(r *gin.Engine) {
+	return func(r *gin.Engine) {
+		// 用户端
+		app := r.Group("/clodLogistic/app/api/v1")
+		auth.Register(app)
+		// 我的
+		myself.Register(app)
+		// 开放接口
+		public.Register(app)
+		// 司机、仓管
+		insider.Register(app)
+		// 地区下拉列表
+		common.Register(app)
+
+		// 管理后台
+		admin := r.Group("/clodLogistic/manage/api/v1")
+		manage.Register(admin)
+	}
+}
+
+// RegisterCron 注册周期任务
+func RegisterCron() func(c *watcher.MyCronJob) {
+	return func(c *watcher.MyCronJob) {
+		var err error
+		orderNoJob := ordercron.NewOrderNoJob()
+		_, err = c.RegisterJob("0 0 */2 * * ?", // 每隔两小时触发
+			watcher.NewJob(orderNoJob, watcher.WithSkipRunningJobV2()), // 若上次任务未结束就跳过,遇panic可以下一轮调度
+			watcher.WithRegisterStop(orderNoJob))
+
+		if err != nil {
+			panic(err)
+		}
+	}
+}

+ 43 - 0
internal/server/adapter/http/middleware/account_type.go

@@ -0,0 +1,43 @@
+package middleware
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func UserAccount() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		if tokenInfo, exist := c.Get(constant.TokenInfoKey); exist {
+			if tokenInfo.(global.TokenInfo).AccountType != constant.AccountApplet {
+				core.WriteResponse(c, errors.WithCode(codex.ErrLoginFailed, "该账号不能进行此操作"), nil)
+				c.Abort()
+				return
+			}
+		} else {
+			core.WriteResponse(c, errors.WithCode(codex.ErrSignatureInvalid, "unrecognized Authorization header."), nil)
+			c.Abort()
+			return
+		}
+	}
+}
+
+func PlatformAccount() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		if tokenInfo, exist := c.Get(constant.TokenInfoKey); exist {
+			info := tokenInfo.(global.TokenInfo)
+			if info.AccountType != constant.AccountPlatform {
+				core.WriteResponse(c, errors.WithCode(codex.ErrLoginFailed, "该账号不能进行此操作"), nil)
+				c.Abort()
+				return
+			}
+		} else {
+			core.WriteResponse(c, errors.WithCode(codex.ErrSignatureInvalid, "unrecognized Authorization header."), nil)
+			c.Abort()
+			return
+		}
+	}
+}

+ 129 - 0
internal/server/adapter/http/middleware/auth.go

@@ -0,0 +1,129 @@
+package middleware
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/utils/headutil"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/authutil"
+	"github.com/gin-gonic/gin"
+	"github.com/golang-jwt/jwt/v4"
+	"time"
+)
+
+func Auth() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		tokenType, token, err := headutil.ParseAuthHead(c)
+		if err != nil {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrInvalidAuthHeader, err.Error()), nil)
+			c.Abort()
+			return
+		}
+
+		switch tokenType {
+		case constant.AuthTokenTypeBearer:
+			var jwtClaim *jwt.MapClaims
+			jwtClaim, err = authutil.ParseToken(token, "")
+			if err != nil {
+				core.WriteResponse(c, errors.WrapC(err, codex.ErrSignatureInvalid, "Parse Authorization token fail."), nil)
+				c.Abort()
+				return
+			}
+
+			var accountId int
+			accountId, err = verifyToken(c, token, jwtClaim)
+			if err != nil {
+				core.WriteResponse(c, errors.WrapC(err, codex.ErrSignatureInvalid, "Parse Authorization token fail."), nil)
+				c.Abort()
+				return
+			}
+
+			if c.FullPath() != "/clodLogistic/app/api/v1/myself/refreshToken" {
+				if !jwtClaim.VerifyExpiresAt(time.Now().Unix(), false) {
+					core.WriteResponse(c, errors.WrapC(err, codex.ErrStatusForbidden, ""), nil)
+					c.Abort()
+					return
+				}
+
+				if err = refreshToken(c, jwtClaim); err != nil {
+					core.WriteResponse(c, errors.WrapC(err, codex.ErrSignatureInvalid, "Parse Authorization token fail."), nil)
+					c.Abort()
+					return
+				}
+			}
+
+			err = setTokenInfo(c, accountId)
+			if err != nil {
+				core.WriteResponse(c, errors.WrapC(err, codex.ErrSignatureInvalid, "Parse Authorization token fail."), nil)
+				c.Abort()
+				return
+			}
+		default:
+			core.WriteResponse(c, errors.WithCode(codex.ErrSignatureInvalid, "unrecognized Authorization header."), nil)
+			c.Abort()
+			return
+		}
+		c.Next()
+	}
+}
+
+func verifyToken(c *gin.Context, token string, claim *jwt.MapClaims) (int, error) {
+	clMap := *claim
+	_, ok := clMap["iss"].(string)
+	if !ok {
+		return -1, errors.New("account token iss invalid")
+	}
+
+	uid, ok := clMap["uid"].(float64)
+	if !ok {
+		return -1, errors.New("account token iss invalid")
+	}
+
+	accountId := int(uid)
+	redisT, err := domainservice.GetToken(c, accountId)
+	if err != nil {
+		return -1, errors.WithStackOnce(err)
+	}
+
+	if redisT == "" {
+		return -1, errors.WithCode(codex.ErrSignatureInvalid, "Parse Authorization token fail.")
+	}
+
+	if redisT != token {
+		return -1, errors.New("account token iss invalid")
+	}
+
+	return accountId, nil
+}
+
+// refreshToken 刷新token
+func refreshToken(ctx *gin.Context, claim *jwt.MapClaims) error {
+	clMap := *claim
+	accId := int(clMap["uid"].(float64))
+	exp := time.Now().Add(2 * time.Hour).Unix()
+
+	expTime := time.Unix(int64(clMap["exp"].(float64)), 0)
+	// 还有10分钟过期时发放新token
+	if expTime.Sub(time.Now()) <= 10*time.Minute {
+		newToken := authutil.Sign(accId, "", constant.CCLAppletLoginJWTISS, "", exp)
+		ctx.Header("new-accessToken", newToken)
+	}
+	return nil
+}
+
+func setTokenInfo(c *gin.Context, accountId int) error {
+	tokenInfo, err := domainservice.GetTokenInfoById(c, accountId)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+
+	c.Set(constant.TokenInfoKey, tokenInfo)
+	// logger 补充accountId信息
+	AccountIdLogger := c.Value(log.GetContextKey()).(log.Logger)
+	AccountIdLogger = AccountIdLogger.WithValues("accountId", tokenInfo.AccountId)
+	c.Set(log.GetContextKey(), AccountIdLogger)
+	return nil
+}

+ 161 - 0
internal/server/adapter/http/middleware/manage_auth.go

@@ -0,0 +1,161 @@
+package middleware
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/pkg/utils/headutil"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"github.com/gin-gonic/gin"
+)
+
+// ManageAuth 平台验证
+func ManageAuth() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		_, token, err := headutil.ParseAuthHead(c)
+		if err != nil {
+			core.WriteResponse(c, errors.WrapC(err, codex.ErrSignatureInvalid, "Parse Authorization token fail."), nil)
+			c.Abort()
+			return
+		}
+
+		if token == "" {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrSignatureInvalid, ""), nil)
+			c.Abort()
+			return
+
+		}
+
+		tokenInfo, err := Verification(c, token)
+		if err != nil {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrLoginFailed, "验证失败,请重新登陆"), nil)
+			c.Abort()
+			return
+		}
+
+		c.Set(constant.TokenInfoKey, tokenInfo)
+		AccountIdLogger := c.Value(log.GetContextKey()).(log.Logger)
+		AccountIdLogger = AccountIdLogger.WithValues("accountId", tokenInfo.AccountId)
+		c.Set(log.GetContextKey(), AccountIdLogger)
+		c.Next()
+	}
+}
+
+func ManageAuthV2() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		userToken, err := c.Cookie("User_tokey")
+		if err != nil {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrLoginFailed, "验证失败,请重新登陆"), nil)
+			c.Abort()
+			return
+		}
+
+		if userToken == "" {
+			userToken = c.PostForm("User_tokey")
+		}
+		if userToken == "" {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrSignatureInvalid, ""), nil)
+			c.Abort()
+			return
+
+		}
+
+		tokenInfo, err := Verification(c, userToken)
+		if err != nil {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrLoginFailed, "验证失败,请重新登陆"), nil)
+			c.Abort()
+			return
+		}
+
+		c.Set(constant.TokenInfoKey, tokenInfo)
+		AccountIdLogger := c.Value(log.GetContextKey()).(log.Logger)
+		AccountIdLogger = AccountIdLogger.WithValues("accountId", tokenInfo.AccountId)
+		c.Set(log.GetContextKey(), AccountIdLogger)
+		c.Next()
+	}
+}
+
+func ManagePermis() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		tokenInfo := global.GetTokenInfoFromContext(c)
+		hasPermis, err := clod.NewBzdClodService().CheckUserPermissions(c, clod.PermisParam{
+			Power_Id: tokenInfo.PowerId,
+			Req_Url:  c.FullPath(),
+		})
+		if err != nil {
+			core.WriteResponse(c, errors.WithCodeOnce(err, codex.ErrOpPermissionFailed, ""), nil)
+			c.Abort()
+			return
+		}
+
+		if !hasPermis {
+			core.WriteResponse(c, errors.WithCode(codex.ErrOperationForbideen, ""), nil)
+			c.Abort()
+			return
+		}
+		c.Next()
+	}
+}
+
+func Verification(c *gin.Context, token string) (info global.TokenInfo, err error) {
+	ok, pid, user, err := clod.NewBzdClodService().LoginVerification(c, token)
+	if err != nil {
+		return info, err
+	}
+	if !ok {
+		return info, errors.New("验证失败,请重新登陆")
+	}
+
+	accInfo := models.Account{}
+	store := dao.NewDataStore(global.CommonConnectRepoInst.StoreDB)
+	err = store.InTx(c, func(ctx context.Context) error {
+		accInfo, err = store.Account().FindByUuid(c, user.T_uuid)
+		if err != nil {
+			return err
+		}
+
+		accInfo.UsePid = user.T_pid
+		accInfo.PowerId = user.T_power
+		accInfo.Phone = user.T_phone
+		accInfo.Name = user.T_name
+		if pid > 0 {
+			accInfo.UsePid = pid
+		}
+
+		if accInfo.Id == 0 {
+			accInfo.Uuid = user.T_uuid
+			accInfo.Pid = user.T_pid
+			accInfo.AccountType = constant.AccountPlatform
+			accInfo.FirstLogin = constant.NO
+			if err = store.Account().Create(c, &accInfo); err != nil {
+				return err
+			}
+		} else {
+			if err = store.Account().UpdateById(c, &accInfo); err != nil {
+				return err
+			}
+		}
+		return nil
+	})
+	if err != nil {
+		return info, err
+	}
+
+	info = global.TokenInfo{
+		AccountId:   accInfo.Id,
+		AccountUuid: accInfo.Uuid,
+		AccountType: constant.AccountPlatform,
+		Pid:         accInfo.Pid,
+		Name:        accInfo.Name,
+		Phone:       accInfo.Phone,
+		PowerId:     accInfo.PowerId,
+		UsePid:      accInfo.UsePid,
+	}
+	return info, nil
+}

+ 165 - 0
internal/server/adapter/http/v1/auth/auth.go

@@ -0,0 +1,165 @@
+package auth
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/pkg/common/options"
+	"Cold_Logistic/internal/server/adapter/http/middleware"
+	"Cold_Logistic/internal/server/application/authsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"encoding/json"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+	"github.com/skip2/go-qrcode"
+	"net/http"
+	"net/url"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+	// 小程序登录
+	r.POST("/auth/login", api.login)
+	r.POST("/auth/wechatLogin", api.wechatLogin)
+	r.POST("/auth/wechatCallback", api.wechatCallBack)
+
+	r.POST("/auth/loginOut", middleware.Auth(), api.LoginOut)
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}
+
+// Login 登录
+func (api Api) login(c *gin.Context) {
+	req := authsrv.LoginReqVo{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	err := req.Validate()
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := authsrv.NewAuthService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+
+	var res authsrv.LoginRespVo
+	switch req.LoginType {
+	case constant.AccountPlatform:
+		res, err = srv.PlatformLogin(c, req)
+		if err != nil {
+			core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSystemSrv, ""))
+			return
+		}
+	case constant.AccountApplet:
+		res, err = srv.UserLogin(c, req)
+		if err != nil {
+			core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSystemSrv, ""))
+			return
+		}
+	}
+
+	core.WriteResponse(c, nil, res)
+}
+
+// wechatLogin 微信扫码登录
+func (api Api) wechatLogin(c *gin.Context) {
+	appId := options.OptInstance.Wechat.AppId
+	state := ""                                                            //防止跨站请求伪造攻击 增加安全性
+	redirectURL := url.QueryEscape(options.OptInstance.Wechat.RedirectUri) //userinfo,
+	wechatLoginURL := fmt.Sprintf("https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&state=%s&scope=snsapi_userinfo#wechat_redirect", appId, redirectURL, state)
+	wechatLoginURL, _ = url.QueryUnescape(wechatLoginURL)
+
+	// 生成二维码
+	qrCode, err := qrcode.Encode(wechatLoginURL, qrcode.Medium, 256)
+	if err != nil {
+		// 错误处理
+		c.String(http.StatusInternalServerError, "Error generating QR code")
+		return
+	}
+
+	// c.Redirect(http.StatusTemporaryRedirect, wechatLoginURL)
+	head := map[string]string{
+		"Content-Type": "image/png",
+	}
+	// 将二维码图片作为响应返回给用户
+	core.WriteBytesResponse(c, nil, qrCode, head)
+}
+
+func (api Api) wechatCallBack(c *gin.Context) {
+	// 获取微信返回的授权码
+	code := c.Query("code")
+	appId := options.OptInstance.Wechat.AppId
+	appSecret := options.OptInstance.Wechat.AppSecret
+	// 向微信服务器发送请求,获取access_token和openid
+	tokenResp, err := http.Get(fmt.Sprintf("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", appId, appSecret, code))
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "error,获取token失败"))
+		return
+	}
+
+	// 解析响应中的access_token和openid
+	var tokenData struct {
+		AccessToken  string `json:"access_token"`
+		ExpiresIn    int    `json:"expires_in"`
+		RefreshToken string `json:"refresh_token"`
+		OpenID       string `json:"openid"`
+		Scope        string `json:"scope"`
+	}
+	if err1 := json.NewDecoder(tokenResp.Body).Decode(&tokenData); err1 != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "error,获取token失败"))
+		return
+	}
+
+	userInfoURL := fmt.Sprintf("https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s", tokenData.AccessToken, tokenData.OpenID)
+	userInfoResp, err := http.Get(userInfoURL)
+	defer userInfoResp.Body.Close()
+	if err != nil {
+		// 错误处理
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "获取失败"))
+		return
+	}
+
+	//------------------------------------
+	var userData struct {
+		OpenID   string `json:"openid"`
+		Nickname string `json:"nickname"`
+	}
+	if err1 := json.NewDecoder(userInfoResp.Body).Decode(&userData); err1 != nil {
+		// 错误处理
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "获取用户信息失败"))
+		return
+	}
+
+	req := authsrv.LoginReqVo{
+		LoginType: constant.AccountApplet,
+		Openid:    userData.OpenID,
+		NickName:  userData.Nickname,
+	}
+	srv := authsrv.NewAuthService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UserLogin(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSystemSrv, ""))
+		return
+	}
+
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) LoginOut(c *gin.Context) {
+	srv := authsrv.NewAuthService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	err := srv.LoginOut(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSystemSrv, ""))
+		return
+	}
+	core.WriteResponse(c, nil, "success")
+}

+ 78 - 0
internal/server/adapter/http/v1/common/api.go

@@ -0,0 +1,78 @@
+package common
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/adapter/http/middleware"
+	"Cold_Logistic/internal/server/application/commonsrv"
+	"Cold_Logistic/internal/server/application/devicesrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+	common := r.Group("/common")
+	common.Use(middleware.Auth())
+	common.GET("/provinceList", api.provinceList)     // 省市区列表
+	common.GET("/sensorDataList", api.sensorDataList) // 设备数据列表
+	common.GET("/logisticList", api.logisticList)     // 设备数据列表
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}
+
+func (api Api) provinceList(c *gin.Context) {
+	srv := commonsrv.NewCommonService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	data, err := srv.ProvinceList(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, data)
+}
+
+// sensorDataList 设备数据列表
+func (api Api) sensorDataList(c *gin.Context) {
+	req := devicesrv.SnDataListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := devicesrv.NewDeviceService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.SnDataList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+// logisticList 物流公司列表
+func (api Api) logisticList(c *gin.Context) {
+	req := commonsrv.LogisticListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := commonsrv.NewCommonService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.LogisticList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 30 - 0
internal/server/adapter/http/v1/insider/api.go

@@ -0,0 +1,30 @@
+package insider
+
+import (
+	"Cold_Logistic/internal/server/adapter/http/middleware"
+	"github.com/gin-gonic/gin"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+	driver := r.Group("/driver")
+	driver.Use(middleware.Auth(), middleware.PlatformAccount())
+	driver.POST("/carInfo", api.carInfo)           // 车辆信息
+	driver.POST("/taskPage", api.taskPage)         // 司机任务列表
+	driver.POST("/orderIntoCar", api.orderIntoCar) // 装车
+	driver.POST("/signReceipt", api.signReceipt)   // 签收
+
+	house := r.Group("/warehouse")
+	house.Use(middleware.Auth(), middleware.PlatformAccount())
+	house.POST("/info", api.houseInfo)           // 仓库信息
+	house.POST("/orderPage", api.warehouseOrder) // 库中订单列表
+	house.POST("/orderInto", api.orderIntoHouse) // 订单入库
+	house.POST("/orderOut", api.orderOutHouse)   // 订单出库
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}

+ 106 - 0
internal/server/adapter/http/v1/insider/driver.go

@@ -0,0 +1,106 @@
+package insider
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/driversrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) carInfo(c *gin.Context) {
+	srv := driversrv.NewDriverService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.DriverCarInfo(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) taskPage(c *gin.Context) {
+	req := driversrv.TaskPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := driversrv.NewDriverService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.TaskPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+
+}
+
+func (api Api) orderIntoCar(c *gin.Context) {
+	req := driversrv.OrderIntoCarReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := driversrv.NewDriverService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderIntoCar(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) scanIntoCar(c *gin.Context) {
+	req := driversrv.ScanIntoReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := driversrv.NewDriverService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.ScanIntoCar(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) signReceipt(c *gin.Context) {
+	req := driversrv.ScanIntoReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := driversrv.NewDriverService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.SignReceipt(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 79 - 0
internal/server/adapter/http/v1/insider/house.go

@@ -0,0 +1,79 @@
+package insider
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/warehousesrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) houseInfo(c *gin.Context) {
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.WarehouseInfo(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) warehouseOrder(c *gin.Context) {
+	req := warehousesrv.WarehouseOrderReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.WarehouseOrder(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderIntoHouse(c *gin.Context) {
+	req := warehousesrv.OrderIntoHouseReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderIntoHouse(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderOutHouse(c *gin.Context) {
+	req := warehousesrv.OrderIntoHouseReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderIntoHouse(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 53 - 0
internal/server/adapter/http/v1/manage/api.go

@@ -0,0 +1,53 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/server/adapter/http/middleware"
+	"github.com/gin-gonic/gin"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+
+	// 公共接口
+	common := r.Group("/common")
+	common.Use(middleware.ManageAuth(), middleware.PlatformAccount())
+	common.POST("/userList", api.userList) // 冷链系统3.0用户列表
+	common.POST("/deviceSensorList", api.deviceSensorList)
+	common.POST("/sensorDataList", api.snDataList)
+
+	// 车辆管理
+	car := r.Group("/car")
+	car.Use(middleware.ManageAuth(), middleware.PlatformAccount(), middleware.ManagePermis())
+	car.POST("/page", api.carPage)
+	car.POST("/add", api.addCar)
+	car.POST("/update", api.updateCar)
+	car.POST("/driverLog", api.driverLog)
+
+	// 仓库管理
+	warehouse := r.Group("/warehouse")
+	warehouse.Use(middleware.ManageAuth(), middleware.PlatformAccount(), middleware.ManagePermis())
+	warehouse.POST("/page", api.warehousePage)
+	warehouse.POST("/add", api.addWarehouse)
+	warehouse.POST("/update", api.updateWarehouse)
+	warehouse.POST("/orderPage", api.warehouseOrder)
+
+	// 订单管理
+	order := r.Group("/order")
+	order.Use(middleware.ManageAuth(), middleware.PlatformAccount(), middleware.ManagePermis())
+	order.POST("/page", api.orderPage)
+	order.POST("/detail", api.orderDetail)
+	order.POST("/logistic", api.orderLogistic)
+	order.POST("/assign", api.orderAssign)
+
+	// 统计
+	stat := r.Group("/statistic")
+	stat.POST("/orderNum/byTime", api.statOrderNumByTime)
+	stat.POST("/orderNum/byUser", api.statOrderNumByUser)
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}

+ 90 - 0
internal/server/adapter/http/v1/manage/car.go

@@ -0,0 +1,90 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/carsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) carPage(c *gin.Context) {
+	req := carsrv.CarPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := carsrv.NewCarService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.CarPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) addCar(c *gin.Context) {
+	req := carsrv.AddCarReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := carsrv.NewCarService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AddCar(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) updateCar(c *gin.Context) {
+	req := carsrv.UpdateCarReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := carsrv.NewCarService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UpdateCar(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) driverLog(c *gin.Context) {
+	req := carsrv.DriverLogReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := carsrv.NewCarService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.DriverLog(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 71 - 0
internal/server/adapter/http/v1/manage/common.go

@@ -0,0 +1,71 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/commonsrv"
+	"Cold_Logistic/internal/server/application/devicesrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+// userList 用户列表
+func (api Api) userList(c *gin.Context) {
+	req := commonsrv.UserListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := commonsrv.NewCommonService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UserList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) deviceSensorList(c *gin.Context) {
+	req := devicesrv.DeviceSensorListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := devicesrv.NewDeviceService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.DeviceSensorList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) snDataList(c *gin.Context) {
+	req := devicesrv.SnDataListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := devicesrv.NewDeviceService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.SnDataList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 75 - 0
internal/server/adapter/http/v1/manage/order.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/ordersrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) orderPage(c *gin.Context) {
+	req := ordersrv.ManageOrderPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.ManageOrderPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderDetail(c *gin.Context) {
+	req := ordersrv.OrderDetailReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderDetail(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderLogistic(c *gin.Context) {
+	req := ordersrv.OrderLogisticDetailReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderLogisticDetail(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderAssign(c *gin.Context) {
+	req := ordersrv.AssignOrderReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AssignOrder(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 43 - 0
internal/server/adapter/http/v1/manage/statistic.go

@@ -0,0 +1,43 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/statisticsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) statOrderNumByTime(c *gin.Context) {
+	req := statisticsrv.OrderNumTimeStatReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := statisticsrv.NewStatisticService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderNumTimeStat(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) statOrderNumByUser(c *gin.Context) {
+	req := statisticsrv.OrderNumUserStatReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := statisticsrv.NewStatisticService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderNumUserStat(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 85 - 0
internal/server/adapter/http/v1/manage/warehouse.go

@@ -0,0 +1,85 @@
+package manage
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/warehousesrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) warehousePage(c *gin.Context) {
+	req := warehousesrv.WarehousePageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.WarehousePage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) addWarehouse(c *gin.Context) {
+	req := warehousesrv.AddWarehouseReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AddWarehouse(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) updateWarehouse(c *gin.Context) {
+	req := warehousesrv.UpdateWarehouseReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UpdateWarehouse(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) warehouseOrder(c *gin.Context) {
+	req := warehousesrv.WarehouseOrderReqVO{}
+	if err := c.ShouldBindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := warehousesrv.NewWarehouseService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.WarehouseOrder(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 95 - 0
internal/server/adapter/http/v1/myself/address.go

@@ -0,0 +1,95 @@
+package myself
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/myselfsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) addressPage(c *gin.Context) {
+	req := myselfsrv.AddressPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AddressPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) addAddress(c *gin.Context) {
+	req := myselfsrv.AddAddressReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AddAddress(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) updateAddress(c *gin.Context) {
+	req := myselfsrv.UpdateAddressReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UpdateAddress(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) deleteAddress(c *gin.Context) {
+	req := myselfsrv.DeleteAddressReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	err := srv.DeleteAddress(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrDeletedFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, nil)
+}

+ 37 - 0
internal/server/adapter/http/v1/myself/api.go

@@ -0,0 +1,37 @@
+package myself
+
+import (
+	"Cold_Logistic/internal/server/adapter/http/middleware"
+	"github.com/gin-gonic/gin"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+	myself := r.Group("/myself")
+	myself.Use(middleware.Auth())
+	myself.GET("/info", api.myselfInfo)            // 个人信息
+	myself.POST("/update", api.updateMyselfInfo)   // 修改个人信息
+	myself.POST("/refreshToken", api.refreshToken) // 刷新token
+
+	myself.POST("/address/page", api.addressPage)     // 寄件/收件人列表
+	myself.POST("/address/add", api.addAddress)       // 添加寄件/收件人
+	myself.POST("/address/update", api.updateAddress) // 修改寄件/收件人
+	myself.POST("/address/delete", api.deleteAddress) // 删除寄件/收件人
+
+	myself.POST("/logisticCompany/page", api.logisticPage)     // 物流公司列表
+	myself.POST("/logisticCompany/add", api.addLogistic)       // 物流公司添加
+	myself.POST("/logisticCompany/delete", api.deleteLogistic) // 物流公司删除
+
+	myself.POST("/placeOrder", api.placeOrder)   // 下单
+	myself.POST("/orderPage", api.orderPage)     // 订单列表
+	myself.POST("/orderDetail", api.orderDetail) // 订单详情
+	myself.POST("/orderSubNo", api.orderSubNo)   // 订单揽件码
+
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}

+ 69 - 0
internal/server/adapter/http/v1/myself/logistic.go

@@ -0,0 +1,69 @@
+package myself
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/myselfsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) logisticPage(c *gin.Context) {
+	req := myselfsrv.LogisticPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.LogisticPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) addLogistic(c *gin.Context) {
+	req := myselfsrv.AddLogisticReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.AddLogistic(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) deleteLogistic(c *gin.Context) {
+	req := myselfsrv.DeleteLogisticReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	err := srv.DeleteLogistic(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrDeletedFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, nil)
+}

+ 81 - 0
internal/server/adapter/http/v1/myself/order.go

@@ -0,0 +1,81 @@
+package myself
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/myselfsrv"
+	"Cold_Logistic/internal/server/application/ordersrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) orderPage(c *gin.Context) {
+	req := myselfsrv.OrderPageReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderPage(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderSubNo(c *gin.Context) {
+	req := myselfsrv.OrderSubNoReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderSubNo(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) placeOrder(c *gin.Context) {
+	req := ordersrv.PlaceOrderReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.PlaceOrder(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrPlaceOrderFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) orderDetail(c *gin.Context) {
+	req := ordersrv.OrderDetailReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderDetail(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 52 - 0
internal/server/adapter/http/v1/myself/self.go

@@ -0,0 +1,52 @@
+package myself
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/myselfsrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) myselfInfo(c *gin.Context) {
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.MyselfInfo(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) updateMyselfInfo(c *gin.Context) {
+	req := myselfsrv.UpdateMyselfInfoReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.UpdateMyselfInfo(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) refreshToken(c *gin.Context) {
+	srv := myselfsrv.NewMyselfService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.RefreshToken(c)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrSaveFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 23 - 0
internal/server/adapter/http/v1/public/api.go

@@ -0,0 +1,23 @@
+package public
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func Register(r *gin.RouterGroup) {
+	api := NewApi()
+
+	// 不登录
+	public := r.Group("/public")
+	public.POST("/queryOrder", api.queryExpressOrder)
+	public.POST("/logisticDetail", api.logisticDetail)
+	public.POST("/deviceSensorList", api.deviceSensorList)
+	public.POST("/sensorDataList", api.snDataList)
+	return
+}
+
+type Api struct{}
+
+func NewApi() Api {
+	return Api{}
+}

+ 96 - 0
internal/server/adapter/http/v1/public/public.go

@@ -0,0 +1,96 @@
+package public
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/application/devicesrv"
+	"Cold_Logistic/internal/server/application/ordersrv"
+	"Cold_Logistic/internal/server/infra/dao"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/gin-gonic/gin"
+)
+
+func (api Api) queryExpressOrder(c *gin.Context) {
+	req := ordersrv.QueryExpressOrderReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.QueryExpressOrder(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) logisticDetail(c *gin.Context) {
+	req := ordersrv.OrderLogisticDetailReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := ordersrv.NewOrderService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.OrderLogisticDetail(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) deviceSensorList(c *gin.Context) {
+	req := devicesrv.DeviceSensorListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := devicesrv.NewDeviceService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.DeviceSensorList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}
+
+func (api Api) snDataList(c *gin.Context) {
+	req := devicesrv.SnDataListReqVO{}
+	if err := c.BindJSON(&req); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrBindJSON, ""))
+		return
+	}
+
+	if err := req.Validate(); err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrParamValidate, "参数验证失败:"))
+		return
+	}
+
+	srv := devicesrv.NewDeviceService(dao.NewDataStore(global.CommonConnectRepoInst.StoreDB))
+	res, err := srv.SnDataList(c, req)
+	if err != nil {
+		core.WriteErrResponse(c, errors.WithCodeOnce(err, codex.ErrQueryFailed, ""))
+		return
+	}
+	core.WriteResponse(c, nil, res)
+}

+ 35 - 0
internal/server/adapter/job/ordercron/order_no_job.go

@@ -0,0 +1,35 @@
+package ordercron
+
+import (
+	"Cold_Logistic/internal/pkg/utils/contextutil"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/watcher"
+)
+
+var _ watcher.IMyJob = &OrderNoJob{}
+
+type OrderNoJob struct{}
+
+func NewOrderNoJob() *OrderNoJob {
+	return &OrderNoJob{}
+}
+
+func (j OrderNoJob) Name() string {
+	return "OrderNoJob"
+}
+
+func (j OrderNoJob) Run() {
+	ctx := contextutil.MakeTraceCtx(context.Background(), "cron-job-name", j.Name())
+	log.FromContext(ctx).Info("job start")
+	err := domainservice.GenOrderNo(ctx)
+	if err != nil {
+		log.FromContext(ctx).Errorf("%#+v", err)
+	}
+	log.FromContext(ctx).Info("job over")
+}
+
+func (j OrderNoJob) Stop() {
+	log.Infof("cron job: %s stop", j.Name())
+}

+ 125 - 0
internal/server/application/authsrv/service.go

@@ -0,0 +1,125 @@
+package authsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/authutil"
+	"time"
+)
+
+type AuthService struct {
+	store *dao.DataStore
+}
+
+func NewAuthService(store *dao.DataStore) *AuthService {
+	return &AuthService{store: store}
+}
+
+const limitTime = 7 * 24 * time.Hour
+
+// UserLogin 普通用户登录
+func (srv *AuthService) UserLogin(ctx context.Context, req LoginReqVo) (res LoginRespVo, err error) {
+	token := ""
+	exp := time.Now().Add(limitTime).Unix()
+	account := models.Account{}
+	err = srv.store.InTx(ctx, func(tx context.Context) error {
+		account, err = srv.store.Account().FindByOpenid(tx, req.Openid, req.LoginType)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		if account.Id == 0 {
+			account.Openid = req.Openid
+			account.AccountType = req.LoginType
+			account.FirstLogin = constant.YES
+			if err = srv.store.Account().Create(tx, &account); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		// 签发token
+		token = authutil.Sign(account.Id, "", constant.CCLAppletLoginJWTISS, "", exp)
+		if _, err = domainservice.SetTokenAndInfo(ctx, account, token, limitTime); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.AccessToken = token
+	res.TokenType = constant.AuthTokenTypeBearer
+	res.ExpiresIn = exp
+	res.IsFirst = account.FirstLogin
+	return res, nil
+}
+
+// PlatformLogin 平台账号登录
+func (srv *AuthService) PlatformLogin(ctx context.Context, req LoginReqVo) (res LoginRespVo, err error) {
+	ok, pid, user, err := clod.NewBzdClodService().LoginVerification(ctx, req.TokenKey)
+	if !ok || err != nil {
+		return res, errors.WithCode(codex.ErrSignatureInvalid, "验证失败,请重新登陆")
+	}
+
+	token := ""
+	exp := time.Now().Add(limitTime).Unix()
+	account := models.Account{}
+	err = srv.store.InTx(ctx, func(tx context.Context) error {
+		account, err = srv.store.Account().FindByUuid(ctx, user.T_uuid)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		account.Name = user.T_name
+		account.Phone = user.T_phone
+		account.PowerId = user.T_power
+		account.UsePid = user.T_pid
+		if pid > 0 {
+			account.UsePid = pid
+		}
+
+		if account.Id == 0 {
+			account.Uuid = user.T_uuid
+			account.AccountType = constant.AccountPlatform
+			account.FirstLogin = constant.NO
+			account.Pid = user.T_pid
+			if err = srv.store.Account().Create(ctx, &account); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		if err = srv.store.Account().UpdateById(tx, &account); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		// 签发token
+		token = authutil.Sign(account.Id, "", constant.CCLAppletLoginJWTISS, "", exp)
+		if _, err = domainservice.SetTokenAndInfo(ctx, account, token, limitTime); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.AccessToken = token
+	res.TokenType = constant.AuthTokenTypeBearer
+	res.ExpiresIn = exp
+	return res, nil
+}
+
+func (srv *AuthService) LoginOut(ctx context.Context) error {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	_, err := global.CommonConnectRepoInst.Redis.
+		HDel(ctx, fmt.Sprintf("acc_%d", tokenInfo.AccountId)).Result()
+	return errors.WithStackOnce(err)
+}

+ 38 - 0
internal/server/application/authsrv/vo.go

@@ -0,0 +1,38 @@
+package authsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type LoginReqVo struct {
+	LoginType int    `json:"loginType"` // 登录类型:1-内部人员 2-普通用户
+	Openid    string `json:"openid"`
+	NickName  string `json:"nickName"`
+	TokenKey  string `json:"tokenKey"`
+}
+
+func (r *LoginReqVo) Validate() error {
+	switch r.LoginType {
+	case constant.AccountPlatform:
+		return validation.ValidateStruct(r,
+			validation.Field(&r.TokenKey, validation.Required),
+		)
+	case constant.AccountApplet:
+		return validation.ValidateStruct(r,
+			validation.Field(&r.Openid, validation.Required.Error("请在小程序登录")),
+			//validation.Field(&r.Phone, validation.Required, validation.RuneLength(1, 11)),
+		)
+
+	default:
+		return errors.New("无法识别登录类型")
+	}
+}
+
+type LoginRespVo struct {
+	TokenType   string `json:"tokenType"`
+	AccessToken string `json:"accessToken"`
+	ExpiresIn   int64  `json:"expiresIn"`
+	IsFirst     int    `json:"isFirst"` // 是否首次登录:1-是 2-否
+}

+ 166 - 0
internal/server/application/carsrv/service.go

@@ -0,0 +1,166 @@
+package carsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"time"
+)
+
+type CarService struct {
+	store *dao.DataStore
+}
+
+func NewCarService(store *dao.DataStore) *CarService {
+	return &CarService{store: store}
+}
+
+func (srv *CarService) CarPage(ctx context.Context, req CarPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.CarPageDTO{
+		Page:              req.Page,
+		CarNumber:         req.Search.CarNumber,
+		SnCode:            req.Search.SnCode,
+		DriverAccountUuid: req.Search.DriverAccountUuid,
+	}
+
+	list, total, err := srv.store.Car().Page(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+func (srv *CarService) AddCar(ctx context.Context, req AddCarReqVO) (res CarIdRespVO, err error) {
+	count, err := srv.store.Car().CountByCarNumberOrSnCode(ctx, req.CarNumber, req.SnCode)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if count > 0 {
+		return res, errors.WithCode(codex.ErrParamValidate, "车辆或设备已被添加,不可重复")
+	}
+
+	car := models.Car{
+		CarNumber:       req.CarNumber,
+		Pid:             global.GetTokenInfoFromContext(ctx).UsePid,
+		SnCode:          req.SnCode,
+		DriverUuid:      req.Driver.Uuid,
+		DriverAccountId: 0,
+		CarType:         req.CarType,
+		Enable:          req.Enable,
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.Car().Create(ctx, &car); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		car.DriverAccountId, _, err = domainservice.ProcessDriver(ctx, car.Id, req.Driver)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		if err = srv.store.Car().UpdateById(ctx, &car); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.CarId = car.Id
+	return res, nil
+}
+
+func (srv *CarService) UpdateCar(ctx context.Context, req UpdateCarReqVO) (res CarIdRespVO, err error) {
+	car := models.Car{}
+	if err = srv.store.Car().FirstById(ctx, &car, req.CarId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if req.CarNumber != car.CarNumber || req.SnCode != car.SnCode {
+		count, err := srv.store.Car().CountByCarNumberOrSnCode(ctx, req.CarNumber, req.SnCode, car.Id)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+
+		if count > 0 {
+			return res, errors.WithCode(codex.ErrParamValidate, "车辆或设备已被添加,不可重复")
+		}
+	}
+
+	car.CarNumber = req.CarNumber
+	car.SnCode = req.SnCode
+	car.DriverUuid = req.Driver.Uuid
+	car.CarType = req.CarType
+	car.Enable = req.Enable
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		// 换司机了
+		if req.Driver.Uuid != car.DriverUuid && car.DriverAccountId > 0 {
+			acc := models.Account{}
+			if err = srv.store.Account().FirstById(ctx, &acc, car.DriverAccountId); err != nil {
+				return errors.WithStackOnce(err)
+			}
+
+			acc.CarId = 0
+			if err = srv.store.Account().Save(ctx, &acc); err != nil {
+				return errors.WithStackOnce(err)
+			}
+
+			car.DriverAccountId, _, err = domainservice.ProcessDriver(ctx, car.Id, req.Driver)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+
+			err = srv.store.CarLog().Create(ctx, &models.CarLog{
+				DriverAccountId: car.DriverAccountId,
+				DirverName:      req.Driver.Name,
+				HandoverTime:    models.NewMyTime(time.Now()),
+			})
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+
+		}
+
+		if err = srv.store.Car().UpdateById(ctx, &car); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.CarId = car.Id
+	return res, nil
+}
+
+func (srv *CarService) DriverLog(ctx context.Context, req DriverLogReqVO) (res core.ListResponse, err error) {
+	data, err := srv.store.CarLog().FindAllByCarId(ctx, req.CarId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	list := make([]DriverLogRespVO, 0, len(data))
+	for _, v := range data {
+		list = append(list, DriverLogRespVO{
+			AccountId:    v.DriverAccountId,
+			Name:         v.DirverName,
+			UseTime:      v.CreatedTime,
+			HandoverTime: v.HandoverTime,
+		})
+	}
+	res.List = list
+	return res, nil
+}

+ 67 - 0
internal/server/application/carsrv/vo.go

@@ -0,0 +1,67 @@
+package carsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type CarPageReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		CarNumber         string `json:"carNumber"`
+		SnCode            string `json:"snCode"`
+		DriverAccountUuid string `json:"driverAccountUuid"`
+	} `json:"search"`
+}
+
+type CarIdRespVO struct {
+	CarId int `json:"carId"`
+}
+
+type AddCarReqVO struct {
+	CarNumber string             `json:"carNumber"`
+	SnCode    string             `json:"snCode"`
+	Driver    global.ClodAccount `json:"driver"`
+	CarType   string             `json:"carType"`
+	Enable    int                `json:"enable"`
+}
+
+func (r *AddCarReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.CarNumber, validation.Required, validation.RuneLength(1, 30)),
+		validation.Field(&r.SnCode, validation.Required, validation.RuneLength(1, 100)),
+		validation.Field(&r.Driver),
+		validation.Field(&r.CarType, validation.Required),
+		validation.Field(&r.Enable, validation.In(constant.YES, constant.NO)),
+	)
+}
+
+type UpdateCarReqVO struct {
+	CarId int `json:"carId"`
+	AddCarReqVO
+}
+
+func (r *UpdateCarReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.CarId, validation.Required),
+		validation.Field(&r.AddCarReqVO),
+	)
+}
+
+type DriverLogReqVO struct {
+	CarId int `json:"carId"`
+}
+
+func (r *DriverLogReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.CarId, validation.Required))
+}
+
+type DriverLogRespVO struct {
+	AccountId    int           `json:"accountId"`
+	Name         string        `json:"name"`
+	UseTime      models.MyTime `json:"useTime"`
+	HandoverTime models.MyTime `json:"handoverTime"`
+}

+ 110 - 0
internal/server/application/commonsrv/service.go

@@ -0,0 +1,110 @@
+package commonsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+type CommonService struct {
+	store *dao.DataStore
+}
+
+func NewCommonService(store *dao.DataStore) *CommonService {
+	return &CommonService{store: store}
+}
+
+func (srv *CommonService) ProvinceList(ctx context.Context) (res []*ProvinceListRespVO, err error) {
+	all, err := srv.store.Region().FindAll(ctx)
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+	res = buildRegionTree(res, all)
+	return res, nil
+}
+
+func buildRegionTree(result []*ProvinceListRespVO, all []models.Region) []*ProvinceListRespVO {
+	for _, v := range all {
+		if v.ParentId == 0 {
+			result = append(result, &ProvinceListRespVO{
+				Id:       v.Id,
+				Name:     v.Name,
+				Children: make([]*ProvinceListRespVO, 0),
+			})
+			continue
+		}
+
+		for _, r := range result {
+			if r.Id == v.ParentId {
+				r.Children = append(r.Children, &ProvinceListRespVO{
+					ParentId: v.ParentId,
+					Id:       v.Id,
+					Name:     v.Name,
+					Children: make([]*ProvinceListRespVO, 0),
+				})
+				break
+			}
+
+			buildRegionTree(r.Children, []models.Region{v})
+		}
+
+	}
+
+	return result
+}
+
+// UserList 冷链3.0用户列表
+func (srv *CommonService) UserList(ctx context.Context, req UserListReqVO) (res core.PageListResponse, err error) {
+	if req.UserTokey == "" {
+		accId := global.GetTokenInfoFromContext(ctx).AccountId
+		req.UserTokey, err = srv.store.Account().FindTokenKeyById(ctx, accId)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+	result, err := clod.NewBzdClodService().UserList(ctx, clod.UserListParam{
+		UserToken: req.UserTokey,
+		Name:      req.Search.Name,
+		Page:      req.Page.Page,
+		Page_z:    req.Page.Size,
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = result.Num
+	res.TotalPage = result.PageSize
+	res.Count = len(result.Data)
+	res.List = result.Data
+	return res, nil
+}
+
+// LogisticList 物流公司列表
+func (srv *CommonService) LogisticList(ctx context.Context, req LogisticListReqVO) (res core.PageListResponse, err error) {
+	if req.UserTokey == "" {
+		accId := global.GetTokenInfoFromContext(ctx).AccountId
+		req.UserTokey, err = srv.store.Account().FindTokenKeyById(ctx, accId)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+	result, err := clod.NewBzdClodService().LogisticCompanyList(ctx, clod.LogisticCompanyListParam{
+		UserTokey: req.UserTokey,
+		TName:     req.Search.Name,
+		Page:      req.Page.Page,
+		Page_z:    req.Page.Size,
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = result.Num
+	res.TotalPage = result.PageSize
+	res.Count = len(result.Data)
+	res.List = result.Data
+	return res, nil
+}

+ 28 - 0
internal/server/application/commonsrv/vo.go

@@ -0,0 +1,28 @@
+package commonsrv
+
+import (
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+)
+
+type ProvinceListRespVO struct {
+	ParentId int                   `json:"parentId"`
+	Id       int                   `json:"id"`
+	Name     string                `json:"name"`
+	Children []*ProvinceListRespVO `json:"children"`
+}
+
+type UserListReqVO struct {
+	Page      core.Page `json:"page"`
+	UserTokey string    `json:"userTokey"`
+	Search    struct {
+		Name string `json:"name"`
+	} `json:"search"`
+}
+
+type LogisticListReqVO struct {
+	UserTokey string    `json:"userTokey"`
+	Page      core.Page `json:"page"`
+	Search    struct {
+		Name string `json:"name"`
+	}
+}

+ 51 - 0
internal/server/application/devicesrv/service.go

@@ -0,0 +1,51 @@
+package devicesrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"strconv"
+)
+
+type DeviceService struct {
+	store *dao.DataStore
+}
+
+func NewDeviceService(store *dao.DataStore) *DeviceService {
+	return &DeviceService{store: store}
+}
+
+func (srv DeviceService) DeviceSensorList(ctx context.Context, req DeviceSensorListReqVO) (res DeviceSensorListRespVO, err error) {
+	clodSrv := clod.NewBzdClodService()
+	list, err := clodSrv.DeviceSensorList(ctx, req.SnCode)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.SnCode = req.SnCode
+	res.SnIds = list
+	return res, nil
+}
+
+func (srv DeviceService) SnDataList(ctx context.Context, req SnDataListReqVO) (res core.PageListResponse, err error) {
+	clodSrv := clod.NewBzdClodService()
+	ret, err := clodSrv.DeviceSensorDataList(ctx, clod.DeviceSensorDataListParam{
+		User_tokey: req.UserTokey,
+		T_snid:     req.SnId,
+		Time_start: req.Search.TimeStart.Format(constant.TimeCriterionFormat),
+		Time_end:   req.Search.TimeEnd.Format(constant.TimeCriterionFormat),
+		Page:       strconv.Itoa(req.Page.Page),
+		Page_z:     strconv.Itoa(req.Page.Size),
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = ret.Num
+	res.TotalPage = ret.PageSize
+	res.Count = len(ret.Data)
+	res.List = ret
+	return res, nil
+}

+ 37 - 0
internal/server/application/devicesrv/vo.go

@@ -0,0 +1,37 @@
+package devicesrv
+
+import (
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type DeviceSensorListReqVO struct {
+	SnCode string `json:"snCode"`
+}
+
+func (r *DeviceSensorListReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.SnCode, validation.Required))
+}
+
+type DeviceSensorListRespVO struct {
+	SnCode string      `json:"snCode"`
+	SnIds  interface{} `json:"snIds"`
+}
+
+type SnDataListReqVO struct {
+	UserTokey string    `json:"userTokey"`
+	SnId      string    `json:"snId"`
+	Page      core.Page `json:"page"`
+	Search    struct {
+		TimeStart models.MyTime `json:"timeStart"` // 2023-03-14 00:00:00
+		TimeEnd   models.MyTime `json:"timeEnd"`
+	}
+}
+
+func (r *SnDataListReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.SnId, validation.Required),
+		validation.Field(&r.UserTokey, validation.Required),
+	)
+}

+ 308 - 0
internal/server/application/driversrv/service.go

@@ -0,0 +1,308 @@
+package driversrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"time"
+)
+
+type DriverService struct {
+	store *dao.DataStore
+}
+
+func NewDriverService(store *dao.DataStore) *DriverService {
+	return &DriverService{store: store}
+}
+
+// DriverCarInfo 司机车辆信息
+func (srv *DriverService) DriverCarInfo(ctx context.Context) (res DriverCarInfoRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	car, err := srv.store.Car().FindByUUId(ctx, tokenInfo.AccountUuid)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.CarNumber = car.CarNumber
+	res.SnCode = car.SnCode
+	res.SnIds = make([]global.SnIdVO, 0, 4)
+	snIds, err := clod.NewBzdClodService().DeviceSensorList(ctx, car.SnCode)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	for i := range snIds {
+		if i >= 4 {
+			break
+		}
+		res.SnIds = append(res.SnIds, global.SnIdVO{
+			Id:   snIds[i].TId,
+			Name: snIds[i].TName,
+		})
+	}
+	return res, nil
+}
+
+// TaskPage 司机订单列表
+func (srv *DriverService) TaskPage(ctx context.Context, req TaskPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.OrderTransportTaskPageDTO{
+		Page:    req.Page,
+		OrderNo: req.Search.OrderNo,
+		Status:  req.Status,
+	}
+	list, total, err := srv.store.OrderTransportTask().Page(ctx, dto)
+	if err != nil {
+		return res, nil
+	}
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+// OrderIntoCar 订单装车
+func (srv *DriverService) OrderIntoCar(ctx context.Context, req OrderIntoCarReqVO) (res OrderIntoCarRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.CarId <= 0 {
+		return res, errors.WithCode(codex.ErrParamValidate, "还未给你分配运输车,请联系管理员")
+	}
+
+	order := models.ExpressOrder{}
+	err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if order.OrderStatus == constant.OrderStatusPending {
+		return res, errors.WithCode(codex.ErrParamValidate, "订单还未分派揽件员,请耐心等待")
+	}
+
+	key := fmt.Sprintf("%s_%s", order.OrderNo, req.OrderSubNo)
+	client := global.CommonConnectRepoInst.Redis
+	exist, err := client.Exists(ctx, key).Result()
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if exist != 1 {
+		return res, errors.WithCode(codex.ErrParamValidate, "揽件码错误,请确认!")
+	}
+
+	task := models.OrderTransportTask{}
+	if order.LatestTaskId > 0 {
+		if err = srv.store.OrderTransportTask().FirstById(ctx, &task, order.LatestTaskId); err != nil {
+			if errors.IsErrRecordNotFound(err) {
+				return res, errors.WithCode(codex.ErrParamValidate, "订单还未分派揽件员")
+			}
+			return res, errors.WithStackOnce(err)
+		}
+
+		if task.ExecutorAccountId != global.GetTokenInfoFromContext(ctx).AccountId {
+			return res, errors.WithCode(codex.ErrParamValidate, "不属于你的订单不能操作")
+		}
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogTraffic,
+		OrderId:           order.Id,
+		OrderNo:           order.OrderNo,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            fmt.Sprintf(constant.TemplateIntoCar, tokenInfo.Name),
+	}
+
+	if task.Id > 0 {
+		log.SnCode = task.SnCode
+	} else {
+		log.SnCode, err = srv.store.Car().FindSnCodeById(ctx, tokenInfo.CarId)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if task.Id > 0 {
+			task.Status = constant.TaskStatusExecuting
+			task.StartTime = models.NewMyTime(time.Now())
+			if err = srv.store.OrderTransportTask().UpdateById(ctx, &task); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if order.OrderStatus < constant.OrderStatusInTransit {
+			err = srv.store.ExpressOrder().UpdateInTransitById(ctx, task.OrderId, log.Id)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	_ = domainservice.DelOrderSubNo(ctx, key)
+
+	res.IntoTime = task.StartTime
+	res.OrderId = task.OrderId
+	return res, nil
+}
+
+// ScanIntoCar 扫码装车
+func (srv *DriverService) ScanIntoCar(ctx context.Context, req ScanIntoReqVO) (res OrderIntoCarRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.CarId <= 0 {
+		return res, errors.WithCode(codex.ErrParamValidate, "还未给你分配运输车,请联系管理员")
+	}
+
+	order, err := srv.store.ExpressOrder().FindByOrderNo(ctx, req.OrderNo)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if order.OrderStatus == constant.OrderStatusPending {
+		return res, errors.WithCode(codex.ErrParamValidate, "订单还未分派揽件员,请耐心等待")
+	}
+
+	task := models.OrderTransportTask{}
+	if order.LatestTaskId > 0 {
+		if err = srv.store.OrderTransportTask().FirstById(ctx, &task, order.LatestTaskId); err != nil {
+			if errors.IsErrRecordNotFound(err) {
+				return res, errors.WithCode(codex.ErrParamValidate, "订单还未分派揽件员")
+			}
+			return res, errors.WithStackOnce(err)
+		}
+
+		if task.ExecutorAccountId != global.GetTokenInfoFromContext(ctx).AccountId {
+			return res, errors.WithCode(codex.ErrParamValidate, "不属于你的订单不能操作")
+		}
+	} else {
+		task = models.OrderTransportTask{
+			ExecutorAccountId: tokenInfo.AccountId,
+			CarId:             tokenInfo.CarId,
+			OrderId:           order.Id,
+			OrderNo:           order.OrderNo,
+			Status:            constant.TaskStatusExecuting,
+			StartTime:         models.NewMyTime(time.Now()),
+		}
+		task.SnCode, err = srv.store.Car().FindSnCodeById(ctx, tokenInfo.CarId)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogTraffic,
+		OrderId:           order.Id,
+		OrderNo:           order.OrderNo,
+		SnCode:            task.SnCode,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            fmt.Sprintf(constant.TemplateIntoCar, tokenInfo.Name),
+	}
+
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if task.Id > 0 {
+			task.Status = constant.TaskStatusExecuting
+			task.StartTime = models.NewMyTime(time.Now())
+			if err = srv.store.OrderTransportTask().UpdateById(ctx, &task); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		} else {
+			if err = srv.store.OrderTransportTask().Create(ctx, &task); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if order.OrderStatus < constant.OrderStatusInTransit {
+			err = srv.store.ExpressOrder().UpdateInTransitById(ctx, task.OrderId, log.Id)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.IntoTime = task.StartTime
+	res.OrderId = task.OrderId
+	return res, nil
+}
+
+// SignReceipt 订单签收
+func (srv *DriverService) SignReceipt(ctx context.Context, req ScanIntoReqVO) (res SignReceiptRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+
+	order, err := srv.store.ExpressOrder().FindByOrderNo(ctx, req.OrderNo)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	snCode, err := srv.store.Car().FindSnCodeById(ctx, tokenInfo.CarId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogTraffic,
+		OrderId:           order.Id,
+		OrderNo:           order.OrderNo,
+		SnCode:            snCode,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            constant.TemplateSignReceipt,
+	}
+
+	order.OrderStatus = constant.OrderStatusReceived
+	order.LatestLogId = log.Id
+	order.SignReceiptTime = models.NewMyTime(time.Now())
+	order.SignReceiptBy = tokenInfo.AccountId
+
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if order.LatestTaskId > 0 {
+			if err = srv.store.OrderTransportTask().FinishedTask(ctx, order.LatestTaskId); err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+
+		if err = srv.store.ExpressOrder().UpdateById(ctx, &order); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.OrderId = order.Id
+	res.SingTime = order.SignReceiptTime
+	return res, nil
+}

+ 60 - 0
internal/server/application/driversrv/vo.go

@@ -0,0 +1,60 @@
+package driversrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type DriverCarInfoReqVO struct {
+	UserTokey string `json:"userTokey"`
+}
+
+type DriverCarInfoRespVO struct {
+	CarNumber string          `json:"carNumber"`
+	SnCode    string          `json:"snCode"`
+	SnIds     []global.SnIdVO `json:"snIds"`
+}
+
+type TaskPageReqVO struct {
+	Page   core.Page `json:"page"`
+	Status int       `json:"status"`
+	Search struct {
+		OrderNo string `json:"orderNo"`
+	}
+}
+
+func (r *TaskPageReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.Status, validation.Required))
+}
+
+type OrderIntoCarReqVO struct {
+	OrderId    int    `json:"orderId"`
+	OrderSubNo string `json:"orderSubNo"`
+}
+
+func (r *OrderIntoCarReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.OrderId, validation.Required),
+		validation.Field(&r.OrderSubNo, validation.Required, validation.RuneLength(6, 6)),
+	)
+}
+
+type OrderIntoCarRespVO struct {
+	OrderId  int           `json:"orderId"`
+	IntoTime models.MyTime `json:"intoTime"`
+}
+
+type ScanIntoReqVO struct {
+	OrderNo string `json:"orderNo"`
+}
+
+func (r *ScanIntoReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderNo, validation.Required))
+}
+
+type SignReceiptRespVO struct {
+	OrderId  int           `json:"orderId"`
+	SingTime models.MyTime `json:"singTime"`
+}

+ 98 - 0
internal/server/application/myselfsrv/account_service.go

@@ -0,0 +1,98 @@
+package myselfsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/authutil"
+	"time"
+)
+
+type MyselfService struct {
+	store *dao.DataStore
+}
+
+func NewMyselfService(store *dao.DataStore) *MyselfService {
+	return &MyselfService{store: store}
+}
+
+// MyselfInfo 个人信息
+func (srv *MyselfService) MyselfInfo(ctx context.Context) (res global.AccountInfoVo, err error) {
+	accountInfo := global.GetTokenInfoFromContext(ctx)
+	res.AccountId = accountInfo.AccountId
+	res.AccountType = accountInfo.AccountType
+	res.AccountUuid = accountInfo.AccountUuid
+	res.Openid = accountInfo.Openid
+	res.Name = accountInfo.Name
+	res.Gender = accountInfo.Gender
+	res.Phone = accountInfo.Phone
+	res.CompanyName = accountInfo.CompanyName
+	res.IsFirst = accountInfo.IsFirst
+	res.Role = accountInfo.Role
+	return res, nil
+}
+
+// UpdateMyselfInfo 修改个人信息
+func (srv *MyselfService) UpdateMyselfInfo(ctx context.Context, req UpdateMyselfInfoReqVO) (res global.AccountInfoVo, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	account := models.Account{}
+	err = srv.store.Account().FirstById(ctx, &account, tokenInfo.AccountId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	token, err := domainservice.GetToken(ctx, account.Id)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	account.Name = req.Name
+	account.Gender = req.Gender
+	account.Phone = req.Phone
+	account.CompanyName = req.CompanyName
+	account.FirstLogin = constant.NO
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.Account().Save(ctx, &account); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if _, err = domainservice.SetTokenAndInfo(ctx, account, token, constant.DefaultTokenLimit); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.AccountId = account.Id
+	res.AccountUuid = account.Uuid
+	res.AccountType = account.AccountType
+	res.Openid = account.Openid
+	res.Name = account.Name
+	res.Gender = account.Gender
+	res.Phone = account.Phone
+	res.CompanyName = account.CompanyName
+	res.IsFirst = account.FirstLogin
+	return res, nil
+}
+
+// RefreshToken 刷新token
+func (srv *MyselfService) RefreshToken(ctx context.Context) (res RefreshTokenRespVo, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	exp := time.Now().Add(constant.DefaultTokenLimit).Unix()
+	// 签发token
+	token := authutil.Sign(tokenInfo.AccountId, "", constant.CCLAppletLoginJWTISS, "", exp)
+	err = domainservice.UpdateToken(ctx, tokenInfo.AccountId, token, constant.DefaultTokenLimit)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.TokenType = constant.AuthTokenTypeBearer
+	res.AccessToken = token
+	res.ExpiresIn = exp
+	return res, nil
+}

+ 102 - 0
internal/server/application/myselfsrv/address_service.go

@@ -0,0 +1,102 @@
+package myselfsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// AddressPage 地址列表
+func (srv *MyselfService) AddressPage(ctx context.Context, req AddressPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.AddressBookPageDTO{
+		Page:        req.Page,
+		AddressType: req.AddressType,
+	}
+	list, total, err := srv.store.AddressBook().Page(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+// AddAddress 添加地址
+func (srv *MyselfService) AddAddress(ctx context.Context, req AddAddressReqVO) (res AddressIdRespVO, err error) {
+	address := models.AddressBook{
+		AddressType: req.AddressType,
+		Name:        req.Name,
+		Phone:       req.Phone,
+		ProvinceId:  req.ProvinceId,
+		CityId:      req.CityId,
+		RegionId:    req.RegionId,
+		Address:     req.Address,
+		IsDefault:   req.IsDefault,
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		err = domainservice.AddMyselfAddressTx(ctx, &address)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.AddressId = address.Id
+	return res, nil
+}
+
+// UpdateAddress 修改地址
+func (srv *MyselfService) UpdateAddress(ctx context.Context, req UpdateAddressReqVO) (res AddressIdRespVO, err error) {
+	address := models.AddressBook{}
+	// todo 去重 ?
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.AddressBook().FirstById(ctx, &address, req.AddressId); err != nil {
+			return errors.WithCodeOnce(err, codex.ErrParamValidate, "未找到数据")
+		}
+
+		address.Name = req.Name
+		address.Phone = req.Phone
+		address.ProvinceId = req.ProvinceId
+		address.CityId = req.CityId
+		address.RegionId = req.RegionId
+		address.Address = req.Address
+		address.IsDefault = req.IsDefault
+
+		if err = srv.store.AddressBook().Save(ctx, &address); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		// 只能有一个默认
+		if address.IsDefault == constant.YES {
+			err = srv.store.AddressBook().UpdateDefaultByCreateBy(ctx, constant.NO, address.Id)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.AddressId = address.Id
+	return res, nil
+}
+
+// DeleteAddress 删除地址
+func (srv *MyselfService) DeleteAddress(ctx context.Context, req DeleteAddressReqVO) error {
+	if err := srv.store.AddressBook().DeleteByIds(ctx, req.AddressId); err != nil {
+		return errors.WithStackOnce(err)
+	}
+	return nil
+}

+ 69 - 0
internal/server/application/myselfsrv/logistic_service.go

@@ -0,0 +1,69 @@
+package myselfsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// LogisticPage 物流公司列表
+func (srv *MyselfService) LogisticPage(ctx context.Context, req LogisticPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.LogisticCompanyPageDTO{
+		Page: req.Page,
+	}
+	list, total, err := srv.store.LogisticCompany().Page(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+// AddLogistic 添加物流公司
+func (srv *MyselfService) AddLogistic(ctx context.Context, req AddLogisticReqVO) (res LogisticIdRespVO, err error) {
+	count, err := srv.store.LogisticCompany().CountMyLogistic(ctx, req.Name, req.Pid)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	if count > 0 {
+		return res, errors.WithCode(codex.ErrParamValidate, "该物流公司已添加过")
+	}
+
+	logistic := models.LogisticCompany{
+		Name:      req.Name,
+		IsDefault: req.IsDefault,
+		Pid:       req.Pid,
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.LogisticCompany().Create(ctx, &logistic); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		// 只能有一个默认
+		if logistic.IsDefault == constant.YES {
+			err = srv.store.LogisticCompany().UpdateDefaultByCreateBy(ctx, constant.NO, logistic.Id)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.LogisticId = logistic.Id
+	return res, nil
+}
+
+// DeleteLogistic 删除物流公司
+func (srv *MyselfService) DeleteLogistic(ctx context.Context, req DeleteLogisticReqVO) error {
+	return srv.store.LogisticCompany().DeleteByIds(ctx, req.LogisticId)
+}

+ 55 - 0
internal/server/application/myselfsrv/order_service.go

@@ -0,0 +1,55 @@
+package myselfsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// OrderPage 寄件列表
+func (srv *MyselfService) OrderPage(ctx context.Context, req OrderPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.ExpressOrderPageDTO{
+		Page:        req.Page,
+		OrderNo:     req.Search.OrderNo,
+		OrderStatus: req.Search.OrderStatus,
+	}
+
+	if req.Search.SearchDateTime != "" {
+		dto.PlaceOrderStartTime.Time, dto.PlaceOrderEndTime.Time = req.Search.SearchDateTime.GetRangeTime()
+	} else {
+		dto.PlaceOrderStartTime = req.Search.PlaceOrderStartTime
+		dto.PlaceOrderEndTime = req.Search.PlaceOrderEndTime
+	}
+
+	list, total, err := srv.store.ExpressOrder().MyPage(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+func (srv *MyselfService) OrderSubNo(ctx context.Context, req OrderSubNoReqVO) (res OrderSubNoRespVO, err error) {
+	order := models.ExpressOrder{}
+	if err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	var subNo string
+	if order.OrderStatus == constant.OrderStatusWaitCar {
+		subNo, err = global.CommonConnectRepoInst.Redis.Get(ctx, order.OrderNo).Result()
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+	res.OrderSubNo = subNo
+	return res, nil
+}

+ 148 - 0
internal/server/application/myselfsrv/vo.go

@@ -0,0 +1,148 @@
+package myselfsrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type UpdateMyselfInfoReqVO struct {
+	Name        string `json:"name"`        // 真实名称
+	Gender      string `json:"gender"`      // 性别
+	Phone       string `json:"phone"`       // 电话
+	CompanyName string `json:"companyName"` // 公司
+}
+
+func (r *UpdateMyselfInfoReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.Name, validation.Required, validation.RuneLength(1, 10)),
+		validation.Field(&r.Gender, validation.Required, validation.In("男", "女", "未知")),
+		validation.Field(&r.Phone, validation.Required, validation.RuneLength(1, 11)),
+		validation.Field(&r.CompanyName, validation.Required, validation.RuneLength(1, 30)),
+	)
+}
+
+type RefreshTokenRespVo struct {
+	TokenType   string `json:"tokenType"`
+	AccessToken string `json:"accessToken"`
+	ExpiresIn   int64  `json:"expiresIn"`
+}
+
+type AddressPageReqVO struct {
+	Page        core.Page `json:"page"`
+	AddressType string    `json:"addressType"` // 地址类型:sender-发货人 consignee-收货人
+}
+
+func (r *AddressPageReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.AddressType, validation.Required,
+			validation.In(constant.AddressTypeSender, constant.AddressTypeConsignee)),
+	)
+}
+
+type AddressIdRespVO struct {
+	AddressId int `json:"addressId"`
+}
+
+type AddAddressReqVO struct {
+	AddressType string `json:"addressType"` //地址类型:
+	Name        string `json:"name"`        //姓名
+	Phone       string `json:"phone"`       //联系电话
+	ProvinceId  int    `json:"provinceId"`  //省Id
+	CityId      int    `json:"cityId"`      //市Id
+	RegionId    int    `json:"regionId"`    //区Id
+	Address     string `json:"address"`     //详细地址
+	IsDefault   int    `json:"isDefault"`   //是否默认:1-是 2-否
+}
+
+func (r *AddAddressReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.AddressType, validation.Required, validation.In(constant.AddressTypeSender, constant.AddressTypeConsignee)),
+		validation.Field(&r.Name, validation.Required, validation.RuneLength(1, 10)),
+		validation.Field(&r.Phone, validation.Required, validation.RuneLength(1, 11)),
+		validation.Field(&r.Address, validation.Required, validation.RuneLength(1, 100)),
+		validation.Field(&r.IsDefault, validation.In(constant.YES, constant.NO)),
+	)
+}
+
+type UpdateAddressReqVO struct {
+	AddressId  int    `json:"addressId"`
+	Name       string `json:"name"`       //姓名
+	Phone      string `json:"phone"`      //联系电话
+	ProvinceId int    `json:"provinceId"` //省Id
+	CityId     int    `json:"cityId"`     //市Id
+	RegionId   int    `json:"regionId"`   //区Id
+	Address    string `json:"address"`    //详细地址
+	IsDefault  int    `json:"isDefault"`  //是否默认:1-是 2-否
+}
+
+func (r *UpdateAddressReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.AddressId, validation.Required),
+		validation.Field(&r.Name, validation.Required, validation.RuneLength(1, 10)),
+		validation.Field(&r.Phone, validation.Required, validation.RuneLength(1, 11)),
+		validation.Field(&r.Address, validation.Required, validation.RuneLength(1, 100)),
+		validation.Field(&r.IsDefault, validation.In(constant.YES, constant.NO)),
+	)
+}
+
+type DeleteAddressReqVO struct {
+	AddressId int `json:"addressId"`
+}
+
+func (r *DeleteAddressReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.AddressId, validation.Required))
+}
+
+type LogisticPageReqVO struct {
+	Page core.Page `json:"page"`
+}
+
+type LogisticIdRespVO struct {
+	LogisticId int `json:"logisticId"`
+}
+
+type AddLogisticReqVO struct {
+	Name      string `json:"name"`      //名称
+	IsDefault int    `json:"isDefault"` //是否默认:1-是 - 2-否
+	Pid       int    `json:"pid"`       //冷链系统公司Id
+}
+
+func (r *AddLogisticReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.Name, validation.Required, validation.RuneLength(1, 100)),
+		validation.Field(&r.Pid, validation.Required),
+	)
+}
+
+type DeleteLogisticReqVO struct {
+	LogisticId string `json:"logisticId"`
+}
+
+func (r *DeleteLogisticReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.LogisticId, validation.Required))
+}
+
+type OrderPageReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		OrderNo             string                      `json:"orderNo"` // 订单号
+		OrderStatus         []int                       `json:"orderStatus"`
+		SearchDateTime      constant.SearchDateTimeType `json:"searchDateTime"`
+		PlaceOrderStartTime models.MyTime               `json:"placeOrderStartTime"`
+		PlaceOrderEndTime   models.MyTime               `json:"placeOrderEndTime"`
+	}
+}
+
+type OrderSubNoReqVO struct {
+	OrderId int `json:"orderId"` // 订单
+}
+
+func (r *OrderSubNoReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderId, validation.Required))
+}
+
+type OrderSubNoRespVO struct {
+	OrderSubNo string `json:"orderSubNo"`
+}

+ 143 - 0
internal/server/application/ordersrv/query_service.go

@@ -0,0 +1,143 @@
+package ordersrv
+
+import (
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// QueryExpressOrder 订单号查订单
+func (srv *OrderService) QueryExpressOrder(ctx context.Context, req QueryExpressOrderReqVO) (res QueryExpressOrderRespVO, err error) {
+	order, err := srv.store.ExpressOrder().FindByOrderNo(ctx, req.OrderNo)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if order.Id == 0 {
+		return res, nil
+	}
+	logisticName, err := srv.store.LogisticCompany().FindNameById(ctx, order.LogisticId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	log := models.OrderLogisticLog{}
+	err = srv.store.OrderLogisticLog().FirstById(ctx, &log, order.LatestLogId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.OrderId = order.Id
+	res.OrderNo = order.OrderNo
+	res.OrderStatus = order.OrderStatus
+	res.LogisticName = logisticName
+	res.LatestLocation = LocationInfoVO{
+		LocationTime:  log.CreatedTime,
+		Location:      log.Location,
+		ContactPerson: log.ContactPerson,
+		ContactPhone:  log.ContactPhone,
+		Extend:        log.Extend,
+	}
+	return res, nil
+}
+
+// OrderDetail 订单详情
+func (srv *OrderService) OrderDetail(ctx context.Context, req OrderDetailReqVO) (res OrderDetailRespVO, err error) {
+	order := models.ExpressOrder{}
+	if err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	logisticName, err := srv.store.LogisticCompany().FindNameById(ctx, order.LogisticId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	addressIds := []int{order.SenderAddressId, order.ConsigneeAddressId}
+	addressMap, err := srv.store.AddressBook().GetMapByIds(ctx, addressIds)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res = OrderDetailRespVO{
+		OrderId:             order.Id,
+		OrderNo:             order.OrderNo,
+		LogisticName:        logisticName,
+		OrderStatus:         order.OrderStatus,
+		Sender:              ConvertAddressReqVO(addressMap[order.SenderAddressId]),
+		Consignee:           ConvertAddressReqVO(addressMap[order.ConsigneeAddressId]),
+		CargoType:           order.CargoType,
+		TemperatureInterval: order.TemperatureInterval,
+		CargoNumber:         order.CargoNumber,
+		DeliveryCondition:   order.DeliveryCondition,
+		DeliveryRemark:      order.DeliveryRemark,
+		TimeLimit:           order.TimeLimit,
+		PickupTime:          order.PickupTime,
+		IsWeekendPickup:     order.IsWeekendPickup,
+		IsInsuredValue:      order.IsInsuredValue,
+	}
+
+	return res, nil
+}
+
+// OrderLogisticDetail 订单物流详情
+func (srv *OrderService) OrderLogisticDetail(ctx context.Context, req OrderLogisticDetailReqVO) (res OrderLogisticDetailRespVO, err error) {
+	order := models.ExpressOrder{}
+	if err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	logLink, err := srv.getLogisticLink(ctx, order)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	addressIds := []int{order.SenderAddressId, order.ConsigneeAddressId}
+	addressMap, err := srv.store.AddressBook().GetMapByIds(ctx, addressIds)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Sender = ConvertAddressReqVO(addressMap[order.SenderAddressId])
+	res.Consignee = ConvertAddressReqVO(addressMap[order.ConsigneeAddressId])
+	res.LogisticLink = logLink
+	return res, nil
+}
+
+func (srv *OrderService) getLogisticLink(ctx context.Context, order models.ExpressOrder) ([]LocationInfoVO, error) {
+	logs, err := srv.store.OrderLogisticLog().FindAllByOrderId(ctx, order.Id)
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+	ret := make([]LocationInfoVO, 0, len(logs))
+	for _, v := range logs {
+		ret = append(ret, LocationInfoVO{
+			LocationTime:  v.CreatedTime,
+			Location:      v.Location,
+			ContactPerson: v.ContactPerson,
+			ContactPhone:  v.ContactPhone,
+			Extend:        v.Extend,
+			SnCode:        v.SnCode,
+		})
+	}
+	return ret, nil
+}
+
+// ManageOrderPage 管理后台订单列表
+func (srv *OrderService) ManageOrderPage(ctx context.Context, req ManageOrderPageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.ExpressOrderPageDTO{
+		Page:        req.Page,
+		OrderNo:     req.Search.OrderNo,
+		OrderStatus: []int{req.Search.OrderStatus},
+	}
+	list, total, err := srv.store.ExpressOrder().ManagePage(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}

+ 209 - 0
internal/server/application/ordersrv/service.go

@@ -0,0 +1,209 @@
+package ordersrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+type OrderService struct {
+	store *dao.DataStore
+}
+
+func NewOrderService(store *dao.DataStore) *OrderService {
+	return &OrderService{store: store}
+}
+
+// PlaceOrder 下单
+func (srv *OrderService) PlaceOrder(ctx context.Context, req PlaceOrderReqVO) (res PlaceOrderRespVO, err error) {
+	order := models.ExpressOrder{
+		OrderStatus:         constant.OrderStatusPending,
+		CargoType:           req.CargoType,
+		TemperatureInterval: req.TemperatureInterval,
+		CargoNumber:         req.CargoNumber,
+		DeliveryCondition:   req.DeliveryCondition,
+		DeliveryRemark:      req.DeliveryRemark,
+		TimeLimit:           req.TimeLimit,
+		PickupTime:          req.PickupTime,
+		IsWeekendPickup:     req.IsWeekendPickup,
+		IsInsuredValue:      req.IsInsuredValue,
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		var logistic models.LogisticCompany
+		// 物流
+		if req.LogisticId == 0 {
+			logistic, err = srv.processLogistic(ctx, req.LogisticId, req.LogisticPid, req.LogisticPidName)
+			if err != nil {
+				return errors.WithStackOnce(err)
+			}
+		}
+		order.LogisticId = logistic.Id
+		order.Pid = logistic.Pid
+		// 寄/收件人地址
+		order.SenderAddressId, err = srv.processAddress(ctx, constant.AddressTypeSender, req.Sender)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		order.ConsigneeAddressId, err = srv.processAddress(ctx, constant.AddressTypeConsignee, req.Consignee)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		// 获取订单号
+		order.OrderNo, err = domainservice.GetOrderNo(ctx)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		// 创建订单
+		if err = srv.store.ExpressOrder().Create(ctx, &order); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.OrderNo = order.OrderNo
+	res.PlaceOrderTime = order.CreatedTime
+	return res, nil
+}
+
+// AssignOrder 派单
+func (srv *OrderService) AssignOrder(ctx context.Context, req AssignOrderReqVO) (res AssignOrderRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+
+	order := models.ExpressOrder{}
+	if err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	if err = srv.checkCanAssign(ctx, order); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	_, err = domainservice.GetOrderSubNo(ctx, order.OrderNo)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogTraffic,
+		OrderId:           order.Id,
+		OrderNo:           order.OrderNo,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            fmt.Sprintf(constant.TemplateAssignOrder, req.Driver.Name),
+	}
+
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		task := models.OrderTransportTask{
+			OrderId:     order.Id,
+			Status:      constant.TaskStatusPending,
+			Destination: req.Destination,
+		}
+
+		task.ExecutorAccountId, task.CarId, err = domainservice.ProcessDriver(ctx, 0, req.Driver)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if task.CarId == 0 {
+			return errors.WithCode(codex.ErrParamValidate, "揽件司机未绑定车辆,请绑定后再派单")
+		}
+
+		if err = srv.store.OrderTransportTask().Create(ctx, &task); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		order.OrderStatus = constant.OrderStatusWaitCar
+		order.LatestTaskId = task.Id
+		if err = srv.store.ExpressOrder().UpdateById(ctx, &order); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	res.OrderId = order.Id
+	return res, nil
+}
+
+func (srv *OrderService) processAddress(ctx context.Context, addressType string, req AddressVO) (int, error) {
+	if req.AddressId > 0 {
+		return req.AddressId, nil
+	}
+
+	address := models.AddressBook{
+		AddressType:  addressType,
+		Name:         req.Name,
+		Phone:        req.Phone,
+		ProvinceId:   req.ProvinceId,
+		ProvinceName: req.ProvinceName,
+		CityId:       req.CityId,
+		CityName:     req.CityName,
+		RegionId:     req.RegionId,
+		RegionName:   req.RegionName,
+		Address:      req.Address,
+		IsDefault:    req.IsDefault,
+	}
+	err := domainservice.AddMyselfAddressTx(ctx, &address)
+	if err != nil {
+		return 0, errors.WithStackOnce(err)
+	}
+
+	return address.Id, nil
+}
+
+func (srv *OrderService) processLogistic(ctx context.Context, logisticId, logisticPid int, logisticName string) (res models.LogisticCompany, err error) {
+	if logisticId > 0 {
+		if err = srv.store.LogisticCompany().FirstById(ctx, &res, logisticId); err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	} else {
+		res, err = srv.store.LogisticCompany().FindMyByPid(ctx, logisticPid)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+
+		if res.Id == 0 {
+			res.Pid = logisticPid
+			res.Name = logisticName
+			if err = srv.store.LogisticCompany().Create(ctx, &res); err != nil {
+				return res, errors.WithStackOnce(err)
+			}
+		}
+	}
+
+	return res, nil
+}
+
+func (srv *OrderService) checkCanAssign(ctx context.Context, order models.ExpressOrder) error {
+	if order.OrderStatus == constant.OrderStatusReceived {
+		return errors.New("订单已签收")
+	}
+	if order.LatestTaskId <= 0 {
+		return nil
+	}
+	task := models.OrderTransportTask{}
+	if err := srv.store.OrderTransportTask().FirstById(ctx, &task, order.LatestTaskId); err != nil {
+		return errors.WithStackOnce(err)
+	}
+
+	if task.Status != constant.TaskStatusFinished {
+		return errors.New("还有未处理步骤,无法再次派单")
+	}
+	return nil
+}

+ 192 - 0
internal/server/application/ordersrv/vo.go

@@ -0,0 +1,192 @@
+package ordersrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type AddressVO struct {
+	AddressId    int    `json:"addressId"`    // 地址id
+	Name         string `json:"name"`         // 姓名
+	Phone        string `json:"phone"`        // 联系电话
+	ProvinceId   int    `json:"provinceId"`   // 省Id
+	ProvinceName string `json:"provinceName"` // 省中文名
+	CityId       int    `json:"cityId"`       // 市Id
+	CityName     string `json:"cityName"`     // 市中文名
+	RegionId     int    `json:"regionId"`     // 区Id
+	RegionName   string `json:"regionName"`   // 区中文名
+	Address      string `json:"address"`      // 详细地址
+	IsDefault    int    `json:"isDefault"`    // 是否默认:1-是 2-否
+}
+
+func (r *AddressVO) Validate() error {
+	if r.AddressId > 0 {
+		return nil
+	}
+
+	return validation.ValidateStruct(r,
+		validation.Field(&r.Name, validation.Required),
+		validation.Field(&r.Phone, validation.Required),
+		validation.Field(&r.ProvinceId, validation.Required),
+		validation.Field(&r.CityId, validation.Required),
+		validation.Field(&r.Address, validation.Required),
+		validation.Field(&r.IsDefault, validation.In(constant.YES, constant.NO)),
+	)
+}
+
+func ConvertAddressReqVO(ent models.AddressBook) (ret AddressVO) {
+	ret.AddressId = ent.Id
+	ret.Name = ent.Name
+	ret.Phone = ent.Phone
+	ret.ProvinceId = ent.ProvinceId
+	ret.ProvinceName = ent.ProvinceName
+	ret.CityId = ent.CityId
+	ret.CityName = ent.CityName
+	ret.RegionId = ent.RegionId
+	ret.RegionName = ent.RegionName
+	ret.Address = ent.Address
+	ret.IsDefault = ent.IsDefault
+	return ret
+}
+
+type PlaceOrderReqVO struct {
+	LogisticId          int           `json:"logisticId"`          // 物流ID
+	LogisticPid         int           `json:"logisticPid"`         // 公司ID
+	LogisticPidName     string        `json:"LogisticPidName"`     // 公司名称
+	Sender              AddressVO     `json:"sender"`              // 寄件人
+	Consignee           AddressVO     `json:"consignee"`           // 收件人
+	CargoType           string        `json:"cargoType"`           // 货物类型
+	TemperatureInterval string        `json:"temperatureInterval"` // 温度区间
+	CargoNumber         int           `json:"cargoNumber"`         // 货物数量
+	DeliveryCondition   string        `json:"deliveryCondition"`   // 配送要求
+	DeliveryRemark      string        `json:"deliveryRemark"`      // 运输备注
+	TimeLimit           int           `json:"timeLimit"`           // 时效
+	PickupTime          models.MyTime `json:"pickupTime"`          // 取货时间
+	IsWeekendPickup     int           `json:"isWeekendPickup"`     // 周末是否取货:1-是 2-否
+	IsInsuredValue      int           `json:"isInsuredValue"`      // 是否保价
+}
+
+func (r *PlaceOrderReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.LogisticId, validation.When(r.LogisticPid <= 0, validation.Required)),
+		validation.Field(&r.LogisticPid, validation.When(r.LogisticId <= 0, validation.Required)),
+		validation.Field(&r.LogisticPidName, validation.When(r.LogisticPid > 0, validation.Required)),
+		validation.Field(&r.Sender),
+		validation.Field(&r.Consignee),
+		validation.Field(&r.CargoType, validation.Required),
+		validation.Field(&r.TemperatureInterval, validation.Required),
+		validation.Field(&r.DeliveryCondition, validation.Required),
+		validation.Field(&r.TimeLimit, validation.Required),
+		validation.Field(&r.PickupTime, validation.Required),
+	)
+}
+
+type PlaceOrderRespVO struct {
+	OrderNo        string
+	PlaceOrderTime models.MyTime
+}
+
+type OrderDetailReqVO struct {
+	OrderId int `json:"orderId"` // 订单ID
+}
+
+func (r *OrderDetailReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderId, validation.Required))
+}
+
+type OrderDetailRespVO struct {
+	OrderId             int           `json:"orderId"`             // 订单ID
+	OrderNo             string        `json:"orderNo"`             // 单号
+	LogisticName        string        `json:"logisticName"`        // 物流公司
+	OrderStatus         int           `json:"orderStatus"`         // 订单状态
+	Sender              AddressVO     `json:"sender"`              // 发货人
+	Consignee           AddressVO     `json:"consigneeAddressId"`  // 收货人
+	CargoType           string        `json:"cargoType"`           // 货物类型
+	TemperatureInterval string        `json:"temperatureInterval"` // 温度区间
+	CargoNumber         int           `json:"cargoNumber"`         // 货物数量
+	DeliveryCondition   string        `json:"deliveryCondition"`   // 配送要求
+	DeliveryRemark      string        `json:"deliveryRemark"`      // 运输备注
+	TimeLimit           int           `json:"timeLimit"`           // 时效
+	PickupTime          models.MyTime `json:"pickupTime"`          // 取货时间
+	IsWeekendPickup     int           `json:"isWeekendPickup"`     // 周末是否取货:1-是 2-否
+	IsInsuredValue      int           `json:"isInsuredValue"`      // 是否保价
+}
+
+type OrderLogisticDetailReqVO struct {
+	OrderId int `json:"orderId"` // 订单ID
+}
+
+func (r *OrderLogisticDetailReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderId, validation.Required))
+}
+
+type QueryExpressOrderReqVO struct {
+	OrderNo string `json:"orderNo"` // 运单号
+}
+
+func (r *QueryExpressOrderReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderNo, validation.Required, validation.RuneLength(1, 30)))
+}
+
+type QueryExpressOrderRespVO struct {
+	OrderId        int            `json:"orderId"`        //
+	OrderNo        string         `json:"orderNo"`        // 单号
+	OrderStatus    int            `json:"orderStatus"`    // 订单状态
+	LogisticName   string         `json:"logisticName"`   // 物流名称
+	LatestLocation LocationInfoVO `json:"LatestLocation"` // 最近一次定位信息
+}
+
+type OrderLogisticDetailRespVO struct {
+	OrderId      int              `json:"orderId"`      // 运单ID
+	LogisticLink []LocationInfoVO `json:"logisticLink"` // 物流链
+	Sender       AddressVO        `json:"sender"`       // 发件人
+	Consignee    AddressVO        `json:"consignee"`    // 收件人
+}
+
+// LocationInfoVO 定位信息
+type LocationInfoVO struct {
+	LocationTime  models.MyTime `json:"locationTime"`  // 到达时间
+	Location      string        `json:"location"`      // 位置
+	ContactPerson string        `json:"contactPerson"` // 联系人
+	ContactPhone  string        `json:"contactPhone"`  // 联系电话
+	Extend        string        `json:"extend"`
+	SnCode        string        `json:"snCode"`
+}
+
+type ManageOrderPageReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		OrderNo     string `json:"orderNo"`
+		OrderStatus int    `json:"orderStatus"`
+	} `json:"search"`
+}
+
+type AssignOrderReqVO struct {
+	OrderId     int                `json:"orderId"` // 运单ID
+	Freight     int                `json:"freight"` // 运费分
+	Driver      global.ClodAccount `json:"driver"`
+	Destination string             `json:"destination"` // 目的地:dest-终点 transit-中转
+}
+
+func (r *AssignOrderReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.OrderId, validation.Required),
+		validation.Field(&r.Destination, validation.Required),
+		validation.Field(&r.Driver),
+	)
+}
+
+type AssignOrderRespVO struct {
+	OrderId int `json:"orderId"` // 运单ID
+}
+
+type WarehousePageReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		Name   string `json:"name"`
+		SnCode string `json:"snCode"`
+	} `json:"search"`
+}

+ 53 - 0
internal/server/application/statisticsrv/service.go

@@ -0,0 +1,53 @@
+package statisticsrv
+
+import (
+	"Cold_Logistic/internal/server/infra/dao"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+type StatisticService struct {
+	store *dao.DataStore
+}
+
+func NewStatisticService(store *dao.DataStore) *StatisticService {
+	return &StatisticService{store: store}
+}
+
+// OrderNumTimeStat 订单数量统计-按时间
+func (srv *StatisticService) OrderNumTimeStat(ctx context.Context, req OrderNumTimeStatReqVO) (res []dao.StaticNumData, err error) {
+	dto := dao.StaticOrderNumDTO{
+		StatType:    req.StatType,
+		TimeStart:   req.TimeStart,
+		TimeEnd:     req.TimeEnd,
+		OrderStatus: req.OrderStatus,
+	}
+	res, err = srv.store.ExpressOrder().StaticNumByTime(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	return res, nil
+}
+
+// OrderNumUserStat 订单数量统计-按用户+时间
+func (srv *StatisticService) OrderNumUserStat(ctx context.Context, req OrderNumUserStatReqVO) (res core.PageListResponse, err error) {
+	dto := dao.StaticOrderNumDTO{
+		Page:        req.Page,
+		StatType:    req.Search.StatType,
+		TimeStart:   req.Search.TimeStart,
+		TimeEnd:     req.Search.TimeEnd,
+		OrderStatus: req.Search.OrderStatus,
+	}
+	list, total, err := srv.store.ExpressOrder().StaticNumByUser(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}

+ 46 - 0
internal/server/application/statisticsrv/vo.go

@@ -0,0 +1,46 @@
+package statisticsrv
+
+import (
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"time"
+)
+
+type OrderNumTimeStatReqVO struct {
+	StatType    models.TimeStatType `json:"statType"` // 年,月,天
+	TimeStart   models.MyTime       `json:"timeStart"`
+	TimeEnd     models.MyTime       `json:"timeEnd"`
+	OrderStatus int                 `json:"orderStatus"`
+}
+
+func (r *OrderNumTimeStatReqVO) Init() {
+	if r.StatType == "" {
+		r.StatType = models.TimeStatDay
+	}
+	if r.TimeStart.IsZero() {
+		r.TimeStart = models.NewMyTime(time.Now()).GetYearFirstDay()
+	}
+
+	if r.TimeEnd.IsZero() {
+		r.TimeEnd = models.NewMyTime(time.Now())
+	}
+
+	//if r.TimeEnd.Sub(r.TimeStart.Time).Hours() > float64(12 *24 *time.Hour) {
+	//	r.StatType = models.TimeStatYear
+	//}
+}
+
+type OrderNumTimeStatRespVO struct {
+	Key        string
+	OrderCount int64
+}
+
+type OrderNumUserStatReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		StatType    models.TimeStatType
+		TimeStart   models.MyTime `json:"timeStart"`
+		TimeEnd     models.MyTime `json:"timeEnd"`
+		OrderStatus int           `json:"orderStatus"`
+	}
+}

+ 189 - 0
internal/server/application/warehousesrv/house_service.go

@@ -0,0 +1,189 @@
+package warehousesrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"Cold_Logistic/internal/server/infra/thirdparty/internalservice/clod"
+	"context"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"time"
+)
+
+// WarehouseInfo 仓库信息
+func (srv *WarehouseService) WarehouseInfo(ctx context.Context) (res WarehouseInfoRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	warehouse, err := srv.store.Warehouse().FindByManageUuid(ctx, tokenInfo.AccountUuid)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.Name = warehouse.Name
+	res.SnCode = warehouse.SnCode
+	res.SnIds = make([]global.SnIdVO, 0, 4)
+	snIds, err := clod.NewBzdClodService().DeviceSensorList(ctx, warehouse.SnCode)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+	for i := range snIds {
+		if i >= 4 {
+			break
+		}
+		res.SnIds = append(res.SnIds, global.SnIdVO{
+			Id:   snIds[i].TId,
+			Name: snIds[i].TName,
+		})
+	}
+	return res, nil
+}
+
+// WarehouseOrder 库中订单列表
+func (srv *WarehouseService) WarehouseOrder(ctx context.Context, req WarehouseOrderReqVO) (res core.PageListResponse, err error) {
+	dto := dao.WarehouseOrderPageDTO{
+		Page:        req.Page,
+		Status:      constant.WarehouseStatusIn,
+		OrderNo:     req.Search.OrderNo,
+		WarehouseId: global.GetTokenInfoFromContext(ctx).WarehouseId,
+		TimeStart:   req.Search.TimeStart,
+		TimeEnd:     req.Search.TimeEnd,
+	}
+
+	list, total, err := srv.store.WarehouseOrder().Page(ctx, dto)
+	if err != nil {
+		return res, nil
+	}
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+// OrderIntoHouse 订单入库
+func (srv *WarehouseService) OrderIntoHouse(ctx context.Context, req OrderIntoHouseReqVO) (res OrderIntoHouseRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.WarehouseId >= 0 {
+		return res, errors.WithCode(codex.ErrNoDataPermission, "不是仓管无法入库操作")
+	}
+
+	order := models.ExpressOrder{}
+	if err = srv.store.ExpressOrder().FirstById(ctx, &order, req.OrderId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	logisticName, err := srv.store.LogisticCompany().FindNameById(ctx, order.LogisticId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	house := models.Warehouse{}
+	if err = srv.store.Warehouse().FirstById(ctx, &house, tokenInfo.WarehouseId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	task := models.OrderTransportTask{}
+	if err = srv.store.OrderTransportTask().FirstById(ctx, &task, order.LatestTaskId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	houseOrder := models.WarehouseOrder{
+		WarehouseId: house.Id,
+		SnCode:      house.SnCode,
+		OrderId:     req.OrderId,
+		OrderNo:     order.OrderNo,
+		Status:      constant.WarehouseStatusIn,
+		StorageTime: models.NewMyTime(time.Now()),
+		StorageBy:   tokenInfo.AccountId,
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogWarehouse,
+		OrderId:           order.Id,
+		OrderNo:           order.OrderNo,
+		SnCode:            houseOrder.SnCode,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            fmt.Sprintf(constant.TemplateIntoHouse, logisticName+"-"+house.Address),
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.WarehouseOrder().Create(ctx, &houseOrder); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		order.LatestTaskId = 0
+		if err = srv.store.OrderTransportTask().FinishedTask(ctx, task.Id); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		order.LatestLogId = log.Id
+		if err = srv.store.ExpressOrder().UpdateById(ctx, &order); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.OrderId = order.Id
+	res.OrderNo = order.OrderNo
+	res.IntoTime = houseOrder.StorageTime
+	return res, nil
+}
+
+// OrderOutHouse 订单出库
+func (srv *WarehouseService) OrderOutHouse(ctx context.Context, req OrderOutHouseReqVO) (res OrderOutHouseRespVO, err error) {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.WarehouseId >= 0 {
+		return res, errors.WithCode(codex.ErrNoDataPermission, "不是仓管无法出库操作")
+	}
+
+	houseOrder, err := srv.store.WarehouseOrder().FindByHouseIdAndOrderId(ctx, req.OrderId, tokenInfo.WarehouseId)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if houseOrder.Id == 0 {
+		return res, errors.WithCode(codex.ErrNoDataPermission, "仓库中没有这个订单")
+	}
+
+	log := models.OrderLogisticLog{
+		LogType:           constant.LogisticLogWarehouse,
+		OrderId:           houseOrder.OrderId,
+		OrderNo:           houseOrder.OrderNo,
+		SnCode:            houseOrder.SnCode,
+		ContactPersonUuid: tokenInfo.AccountUuid,
+		ContactPerson:     tokenInfo.Name,
+		ContactPhone:      tokenInfo.Phone,
+		Extend:            constant.TemplateOutHouse,
+	}
+
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.OrderLogisticLog().Create(ctx, &log); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if err = srv.store.WarehouseOrder().OrderOutHouse(ctx, houseOrder.OrderId, houseOrder.WarehouseId); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.OutTime = models.NewMyTime(time.Now())
+	res.OrderId = houseOrder.OrderId
+	res.OrderNo = houseOrder.OrderNo
+	return res, nil
+}

+ 166 - 0
internal/server/application/warehousesrv/manage_service.go

@@ -0,0 +1,166 @@
+package warehousesrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/codex"
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/domain/domainservice"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// WarehousePage 仓库列表
+func (srv *WarehouseService) WarehousePage(ctx context.Context, req WarehousePageReqVO) (res core.PageListResponse, err error) {
+	dto := dao.WarehousePageDTO{
+		Page:   req.Page,
+		Name:   req.Search.Name,
+		SnCode: req.Search.SnCode,
+	}
+	ents, total, err := srv.store.Warehouse().Page(ctx, dto)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	warehouseIds := make([]int, 0, len(ents))
+	accUuids := make([]string, 0, len(ents))
+	for _, v := range ents {
+		warehouseIds = append(warehouseIds, v.Id)
+		if err = core.DatatypeJSONConvertTo(v.ManagerUuid, &accUuids); err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+
+	orderCount, err := srv.store.WarehouseOrder().CountWarehouseOrder(ctx, warehouseIds, constant.WarehouseStatusIn)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	accMap, err := srv.store.Account().FindByUuids(ctx, accUuids)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	list := make([]WarehousePageVO, 0, len(ents))
+	for _, v := range ents {
+		manager := make([]string, 0, 2)
+		if err = core.DatatypeJSONConvertTo(v.ManagerUuid, &manager); err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+		accList := make([]WarehouseManageVO, 0, len(manager))
+
+		for i := range manager {
+			accList = append(accList, WarehouseManageVO{
+				AccountId:   accMap[manager[i]].Id,
+				AccountUuid: manager[i],
+				AccountName: accMap[manager[i]].Name,
+			})
+		}
+		list = append(list, WarehousePageVO{
+			WarehouseId: v.Id,
+			Name:        v.Name,
+			SnCode:      v.SnCode,
+			Address:     v.Address,
+			OrderCount:  orderCount[v.Id],
+			AccountList: accList,
+		})
+	}
+
+	res.Total = total
+	res.TotalPage = total / int64(req.Page.Size)
+	res.Count = len(list)
+	res.List = list
+	return res, nil
+}
+
+// AddWarehouse 添加仓库
+func (srv *WarehouseService) AddWarehouse(ctx context.Context, req AddWarehouseReqVO) (res WarehouseIdRespVO, err error) {
+	count, err := srv.store.Warehouse().CountByNameOrSnCode(ctx, req.Name, req.SnCode)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if count > 0 {
+		return res, errors.WithCode(codex.ErrParamValidate, "名称重复或SN编码已使用")
+	}
+
+	uuids := make([]string, 0, len(req.Manage))
+	for _, v := range req.Manage {
+		uuids = append(uuids, v.Uuid)
+	}
+
+	n, _ := core.ConvertJSONDatatype(uuids)
+	warehouse := models.Warehouse{
+		Pid:         global.GetTokenInfoFromContext(ctx).UsePid,
+		Name:        req.Name,
+		SnCode:      req.SnCode,
+		ManagerUuid: n,
+		Address:     req.Address,
+		Enable:      req.Enable,
+	}
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.Warehouse().Create(ctx, &warehouse); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if err = domainservice.ProcessWareHouse(ctx, warehouse.Id, req.Manage); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.WarehouseId = warehouse.Id
+	return res, nil
+}
+
+// UpdateWarehouse 修改仓库
+func (srv *WarehouseService) UpdateWarehouse(ctx context.Context, req UpdateWarehouseReqVO) (res WarehouseIdRespVO, err error) {
+	warehouse := models.Warehouse{}
+	if err = srv.store.Warehouse().FirstById(ctx, &warehouse, req.WarehouseId); err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	if req.Name != warehouse.Name || req.SnCode == warehouse.SnCode {
+		count, err := srv.store.Warehouse().CountByNameOrSnCode(ctx, req.Name, req.SnCode, warehouse.Id)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+		if count > 0 {
+			return res, errors.WithCode(codex.ErrParamValidate, "名称重复或SN编码已使用")
+		}
+	}
+
+	uuids := make([]string, 0, len(req.Manage))
+	for _, v := range req.Manage {
+		uuids = append(uuids, v.Uuid)
+	}
+
+	n, _ := core.ConvertJSONDatatype(uuids)
+	warehouse.Name = req.Name
+	warehouse.SnCode = req.SnCode
+	warehouse.ManagerUuid = n
+	warehouse.Address = req.Address
+	warehouse.Enable = req.Enable
+	err = srv.store.InTx(ctx, func(ctx context.Context) error {
+		if err = srv.store.Warehouse().UpdateById(ctx, &warehouse); err != nil {
+			return errors.WithStackOnce(err)
+		}
+
+		if err = domainservice.ProcessWareHouse(ctx, warehouse.Id, req.Manage); err != nil {
+			return errors.WithStackOnce(err)
+		}
+		return nil
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res.WarehouseId = warehouse.Id
+	return res, nil
+}

+ 11 - 0
internal/server/application/warehousesrv/service.go

@@ -0,0 +1,11 @@
+package warehousesrv
+
+import "Cold_Logistic/internal/server/infra/dao"
+
+type WarehouseService struct {
+	store *dao.DataStore
+}
+
+func NewWarehouseService(store *dao.DataStore) *WarehouseService {
+	return &WarehouseService{store: store}
+}

+ 108 - 0
internal/server/application/warehousesrv/vo.go

@@ -0,0 +1,108 @@
+package warehousesrv
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+type WarehouseInfoRespVO struct {
+	Name   string          `json:"name"`
+	SnCode string          `json:"snCode"`
+	SnIds  []global.SnIdVO `json:"snIds"`
+}
+
+type WarehouseOrderReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		OrderNo   string        `json:"orderNo"`
+		TimeStart models.MyTime `json:"timeStart"`
+		TimeEnd   models.MyTime `json:"timeEnd"`
+	}
+}
+
+type OrderIntoHouseReqVO struct {
+	OrderId int `json:"orderId"`
+}
+
+func (r *OrderIntoHouseReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderId, validation.Required))
+}
+
+type OrderIntoHouseRespVO struct {
+	OrderId  int           `json:"orderId"`
+	OrderNo  string        `json:"orderNo"`
+	IntoTime models.MyTime `json:"intoTime"`
+}
+
+type OrderOutHouseReqVO struct {
+	OrderId int `json:"orderId"`
+}
+
+func (r *OrderOutHouseReqVO) Validate() error {
+	return validation.ValidateStruct(r, validation.Field(&r.OrderId, validation.Required))
+}
+
+type OrderOutHouseRespVO struct {
+	OrderId int           `json:"orderId"`
+	OrderNo string        `json:"orderNo"`
+	OutTime models.MyTime `json:"outTime"`
+}
+
+type WarehousePageReqVO struct {
+	Page   core.Page `json:"page"`
+	Search struct {
+		Name   string `json:"name"`
+		SnCode string `json:"snCode"`
+	}
+}
+
+type WarehousePageVO struct {
+	WarehouseId int                 `json:"warehouseId"` //
+	Name        string              `json:"name"`        //仓库名称
+	SnCode      string              `json:"snCode"`      //sn编码
+	Address     string              `json:"address"`     //地址
+	OrderCount  int64               `json:"orderCount"`  //订单数量
+	AccountList []WarehouseManageVO `json:"accountList"` // 仓管
+}
+
+type WarehouseManageVO struct {
+	AccountId   int    `json:"accountId"`
+	AccountUuid string `json:"accountUuid"`
+	AccountName string `json:"accountName"`
+}
+
+type AddWarehouseReqVO struct {
+	Name    string               `json:"name"`    //仓库名称
+	SnCode  string               `json:"snCode"`  //sn编码
+	Address string               `json:"address"` //地址
+	Manage  []global.ClodAccount `json:"manage"`
+	Enable  int                  `json:"enable"`
+}
+
+func (r *AddWarehouseReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.Name, validation.Required, validation.RuneLength(1, 50)),
+		validation.Field(&r.SnCode, validation.Required, validation.RuneLength(1, 100)),
+		validation.Field(&r.Address, validation.Required, validation.RuneLength(1, 200)),
+		validation.Field(&r.Enable, validation.In(constant.YES, constant.NO)),
+	)
+}
+
+type WarehouseIdRespVO struct {
+	WarehouseId int `json:"warehouseId"`
+}
+
+type UpdateWarehouseReqVO struct {
+	WarehouseId int `json:"warehouseId"`
+	AddWarehouseReqVO
+}
+
+func (r *UpdateWarehouseReqVO) Validate() error {
+	return validation.ValidateStruct(r,
+		validation.Field(&r.WarehouseId, validation.Required),
+		validation.Field(&r.AddWarehouseReqVO),
+	)
+}

+ 1 - 0
internal/server/domain/domainevent/event.go

@@ -0,0 +1 @@
+package domainevent

+ 208 - 0
internal/server/domain/domainservice/account.go

@@ -0,0 +1,208 @@
+package domainservice
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"encoding/json"
+	"fmt"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"time"
+)
+
+func ProcessDriver(ctx context.Context, carId int, driver global.ClodAccount) (acc int, car int, err error) {
+	store := dao.NewDataStore(global.CommonConnectRepoInst.StoreDB)
+	account, err := store.Account().FindByUuid(ctx, driver.Uuid)
+	if err != nil {
+		return 0, 0, errors.WithStackOnce(err)
+	}
+
+	if account.Id == 0 {
+		account = models.Account{
+			AccountType: constant.AccountPlatform,
+			Name:        driver.Name,
+			Pid:         driver.Pid,
+			Uuid:        driver.Uuid,
+			RoleType:    constant.RoleDriver,
+			CarId:       carId,
+		}
+		if err = store.Car().Create(ctx, &account); err != nil {
+			return 0, 0, errors.WithStackOnce(err)
+		}
+	} else {
+		if carId > 0 {
+			account.CarId = carId
+		}
+		if driver.Name != "" {
+			account.Name = driver.Name
+		}
+		if err = store.Account().UpdateById(ctx, &account); err != nil {
+			return 0, 0, errors.WithStackOnce(err)
+		}
+	}
+	return account.Id, account.CarId, nil
+}
+
+func ProcessWareHouse(ctx context.Context, warehouseId int, houses []global.ClodAccount) error {
+	store := dao.NewDataStore(global.CommonConnectRepoInst.StoreDB)
+
+	uuids := make([]string, 0, len(houses))
+	for _, v := range houses {
+		uuids = append(uuids, v.Uuid)
+	}
+
+	accMap, err := store.Account().FindByUuids(ctx, uuids)
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+
+	addAcc := make([]*models.Account, 0, len(houses)-len(accMap))
+	update := make([]*models.Account, 0)
+	for _, v := range houses {
+		if _, ok := accMap[v.Uuid]; !ok {
+			addAcc = append(addAcc, &models.Account{
+				AccountType: constant.AccountPlatform,
+				Name:        v.Name,
+				Uuid:        v.Uuid,
+				RoleType:    constant.RoleWarehouse,
+				WarehouseId: warehouseId,
+				Pid:         v.Pid,
+			})
+		} else {
+			acc := accMap[v.Uuid]
+			if warehouseId > 0 {
+				acc.WarehouseId = warehouseId
+			}
+			if v.Name != "" {
+				acc.Name = v.Name
+			}
+			update = append(update, &acc)
+		}
+	}
+
+	if len(addAcc) > 0 {
+		if err = store.Account().BatchSave(ctx, addAcc); err != nil {
+			return errors.WithStackOnce(err)
+		}
+	}
+
+	if len(update) > 0 {
+		if err = store.Account().BatchSave(ctx, update); err != nil {
+			return errors.WithStackOnce(err)
+		}
+	}
+
+	return nil
+}
+
+const (
+	accountHashKey = "AccountInfo"
+	accInfoKey     = "acc_%v"
+	tokenKey       = "Token_%v"
+)
+
+func SetTokenAndInfo(ctx context.Context, account models.Account, token string, exp time.Duration) (res global.TokenInfo, err error) {
+	tokenInfo := global.TokenInfo{
+		AccountId:   account.Id,
+		AccountUuid: account.Uuid,
+		Pid:         account.Pid,
+		AccountType: account.AccountType,
+		Role:        account.RoleType,
+		Name:        account.Name,
+		Phone:       account.Phone,
+		Gender:      account.Gender,
+		CompanyName: account.CompanyName,
+		Openid:      account.Openid,
+		IsFirst:     account.FirstLogin,
+		UsePid:      account.UsePid,
+		PowerId:     account.PowerId,
+		CarId:       account.CarId,
+		WarehouseId: account.WarehouseId,
+	}
+	key := fmt.Sprintf(accInfoKey, tokenInfo.AccountId)
+	client := global.CommonConnectRepoInst.Redis
+	bt, err := tokenInfo.MarshalBinary()
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	_, err = client.Set(ctx, fmt.Sprintf(tokenKey, account.Id), token, exp).Result()
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	_, err = client.HSet(ctx, accountHashKey, key, bt).Result()
+	return tokenInfo, errors.WithStackOnce(err)
+}
+
+func UpdateTokenInfo(ctx context.Context, account models.Account) (res global.TokenInfo, err error) {
+	tokenInfo := global.TokenInfo{
+		AccountId:   account.Id,
+		AccountUuid: account.Uuid,
+		Pid:         account.Pid,
+		AccountType: account.AccountType,
+		Role:        account.RoleType,
+		Name:        account.Name,
+		Phone:       account.Phone,
+		Gender:      account.Gender,
+		CompanyName: account.CompanyName,
+		Openid:      account.Openid,
+		IsFirst:     account.FirstLogin,
+		UsePid:      account.UsePid,
+		PowerId:     account.PowerId,
+		CarId:       account.CarId,
+		WarehouseId: account.WarehouseId,
+	}
+	key := fmt.Sprintf(accInfoKey, tokenInfo.AccountId)
+	client := global.CommonConnectRepoInst.Redis
+	bt, err := tokenInfo.MarshalBinary()
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	_, err = client.HSet(ctx, accountHashKey, key, bt).Result()
+	return tokenInfo, errors.WithStackOnce(err)
+}
+
+func UpdateToken(ctx context.Context, accountId int, token string, exp time.Duration) error {
+	client := global.CommonConnectRepoInst.Redis
+	_, err := client.Set(ctx, fmt.Sprintf(tokenKey, accountId), token, exp).Result()
+	return errors.WithStackOnce(err)
+}
+
+func GetToken(ctx context.Context, accountId int) (res string, err error) {
+	key := fmt.Sprintf(tokenKey, accountId)
+	client := global.CommonConnectRepoInst.Redis
+	token, err := client.Get(ctx, key).Result()
+	if err != nil {
+		return "", errors.WithStackOnce(err)
+	}
+	return token, nil
+}
+
+func GetTokenInfoById(ctx context.Context, accountId int) (res global.TokenInfo, err error) {
+	filedKey := fmt.Sprintf("acc_%d", accountId)
+
+	client := global.CommonConnectRepoInst.Redis
+	info, _ := client.HGet(ctx, accountHashKey, filedKey).Result()
+	if info != "" {
+		if err = json.Unmarshal([]byte(info), &res); err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	} else {
+		dataStore := dao.NewDataStore(global.CommonConnectRepoInst.StoreDB)
+		account := models.Account{}
+		err = dataStore.Account().FirstById(ctx, &account, accountId)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+
+		res, err = UpdateTokenInfo(ctx, account)
+		if err != nil {
+			return res, errors.WithStackOnce(err)
+		}
+	}
+	return res, nil
+}

+ 37 - 0
internal/server/domain/domainservice/address_book.go

@@ -0,0 +1,37 @@
+package domainservice
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/dao"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// AddMyselfAddressTx 添加地址
+func AddMyselfAddressTx(ctx context.Context, address *models.AddressBook) error {
+	store := dao.NewDataStore(global.CommonConnectRepoInst.StoreDB)
+	if address.ProvinceName == "" || address.CityName == "" || address.RegionName == "" {
+		nameMap, err := store.Region().FindNameMapByIds(ctx, []int{address.ProvinceId, address.CityId, address.RegionId})
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+		address.ProvinceName = nameMap[address.ProvinceId]
+		address.CityName = nameMap[address.CityId]
+		address.RegionName = nameMap[address.RegionId]
+	}
+
+	if err := store.AddressBook().Create(ctx, address); err != nil {
+		return errors.WithStackOnce(err)
+	}
+	// 只能有一个默认
+	if address.IsDefault == constant.YES {
+		err := store.AddressBook().UpdateDefaultByCreateBy(ctx, constant.NO, address.Id)
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+	}
+
+	return nil
+}

+ 91 - 0
internal/server/domain/domainservice/cos_temp_key.go

@@ -0,0 +1,91 @@
+package domainservice
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/pkg/common/options"
+
+	myCos "gitee.com/hexingqq/go-backend/pkg/contrib/objectStore/cos"
+	sts "github.com/tencentyun/qcloud-cos-sts-sdk/go"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+)
+
+// GetCosTempKey 获取临时秘钥
+func GetCosTempKey(keyPath string) (res *global.Credentials, err error) {
+	storage := options.OptInstance.Storage
+	cosStore, err := myCos.NewCosObjectStore(storage.CosStorageOptions)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	credentials, err := cosStore.GetTmpCredential(keyPath)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res = &global.Credentials{}
+	res.BaseUrl = storage.CosStorageOptions.BaseURL
+	res.Bucket = storage.CosStorageOptions.Bucket
+	res.Region = storage.CosStorageOptions.Region
+	res.StartTime = credentials.StartTime
+	res.ExpiredTime = credentials.ExpiredTime
+	res.TmpSecretKey = credentials.Credentials.TmpSecretKey
+	res.TmpSecretID = credentials.Credentials.TmpSecretID
+	res.SessionToken = credentials.Credentials.SessionToken
+
+	return res, nil
+}
+
+func GetCosTempManyKey(keyPaths []string) (res *global.Credentials, err error) {
+	storage := options.OptInstance.Storage
+	cosStore, err := myCos.NewCosObjectStore(storage.CosStorageOptions)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	credentials, err := cosStore.GetManyTmpCredentialForDirKeyPath(keyPaths)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res = &global.Credentials{}
+	res.BaseUrl = storage.CosStorageOptions.BaseURL
+	res.Bucket = storage.CosStorageOptions.Bucket
+	res.Region = storage.CosStorageOptions.Region
+	res.StartTime = credentials.StartTime
+	res.ExpiredTime = credentials.ExpiredTime
+	res.TmpSecretKey = credentials.Credentials.TmpSecretKey
+	res.TmpSecretID = credentials.Credentials.TmpSecretID
+	res.SessionToken = credentials.Credentials.SessionToken
+
+	return res, nil
+}
+
+func GetCosPathTempKey(keyPath string, durationSecond int64) (res *global.Credentials, err error) {
+	storage := options.OptInstance.Storage
+	cosStore, err := myCos.NewCosObjectStore(storage.CosStorageOptions)
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	credentials, err := cosStore.GetTmpCredentialForDirKeyPath(keyPath, func(credentialOptions *sts.CredentialOptions) {
+		if durationSecond > 0 {
+			credentialOptions.DurationSeconds = durationSecond
+		}
+	})
+	if err != nil {
+		return res, errors.WithStackOnce(err)
+	}
+
+	res = &global.Credentials{}
+	res.BaseUrl = storage.CosStorageOptions.BaseURL
+	res.Bucket = storage.CosStorageOptions.Bucket
+	res.Region = storage.CosStorageOptions.Region
+	res.StartTime = credentials.StartTime
+	res.ExpiredTime = credentials.ExpiredTime
+	res.TmpSecretKey = credentials.Credentials.TmpSecretKey
+	res.TmpSecretID = credentials.Credentials.TmpSecretID
+	res.SessionToken = credentials.Credentials.SessionToken
+
+	return res, nil
+}

+ 112 - 0
internal/server/domain/domainservice/order_no.go

@@ -0,0 +1,112 @@
+package domainservice
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myredis"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/log"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/idutil"
+	"time"
+)
+
+const OrderRedisKey = "bzd_clod_logistic_order_no"
+
+func GetOrderNo(ctx context.Context) (string, error) {
+	client := global.CommonConnectRepoInst.Redis
+	if client == nil {
+		return "", errors.WithStackOnce(errors.New("未初始化Redis,无法使用"))
+	}
+
+	orderNo, err := client.BRPop(ctx, 3*time.Second, OrderRedisKey).Result()
+	if err != nil {
+		return "", errors.WithStackOnce(err)
+	}
+
+	if len(orderNo) < 2 {
+		return "", errors.WithStackOnce(errors.New("订单号获取失败"))
+	}
+
+	// 异步增加订单号
+	go func() {
+		if err = GenOrderNo(ctx); err != nil {
+			log.FromContext(ctx).Errorf("%#+v", err)
+		}
+	}()
+
+	return orderNo[1], nil
+
+}
+
+func GenOrderNo(ctx context.Context) (err error) {
+	client := global.CommonConnectRepoInst.Redis
+	if client == nil {
+		return errors.WithStackOnce(errors.New("未初始化Redis,无法使用"))
+	}
+
+	count, err := client.LLen(ctx, OrderRedisKey).Result()
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+
+	if count > 1000 {
+		return nil
+	}
+
+	mutex := myredis.NewRedisMutexLock(OrderRedisKey, client)
+	if err = mutex.LockContext(ctx); err != nil {
+		return errors.WithStackOnce(errors.New("获取分布式锁失败"))
+	}
+	defer func() {
+		// 如果释放失败了,就重试一次
+		var ok bool
+		if ok, err = mutex.UnlockContext(ctx); !ok || err != nil {
+			_, err = mutex.UnlockContext(ctx)
+		}
+	}()
+
+	// 每次生成订单号:n*i
+	for n := 0; n < 10; n++ {
+		orderNoList := make([]string, 0, 500)
+		for i := 0; i < 500; i++ {
+			orderNoList = append(orderNoList, idutil.GetSonyFlakeStringID())
+			time.Sleep(500 * time.Millisecond)
+		}
+
+		err = client.LPush(ctx, OrderRedisKey, orderNoList).Err()
+		if err != nil {
+			return errors.WithStackOnce(err)
+		}
+	}
+
+	return nil
+
+}
+
+// GetOrderSubNo 订单揽件码
+func GetOrderSubNo(ctx context.Context, orderNo string) (string, error) {
+	client := global.CommonConnectRepoInst.Redis
+	code, err := client.Get(ctx, orderNo).Result()
+	if err != nil {
+		return "", errors.WithStackOnce(err)
+	}
+
+	if code == "" {
+		code = orderNo[len(orderNo)-6:]
+		err = client.Set(ctx, code, orderNo, 7*24*time.Hour).Err()
+		if err != nil {
+			return "", errors.WithStackOnce(err)
+		}
+	}
+	return code, nil
+}
+
+// DelOrderSubNo 删除订单揽件码
+func DelOrderSubNo(ctx context.Context, keys ...string) error {
+	client := global.CommonConnectRepoInst.Redis
+	_, err := client.Del(ctx, keys...).Result()
+	if err != nil {
+		return errors.WithStackOnce(err)
+	}
+	return nil
+}

+ 36 - 0
internal/server/domain/domainservice/order_no_test.go

@@ -0,0 +1,36 @@
+package domainservice
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/pkg/common/options"
+	"Cold_Logistic/internal/pkg/utils/contextutil"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/database/myredis"
+	"testing"
+)
+
+func init() {
+	options.OptInstance = &options.Options{
+		Redis: &myredis.RedisOption{
+			Enable: true,
+			Addr:   "192.168.11.23:6379",
+			DB:     11,
+		},
+	}
+	global.CommonConnectRepoInst = global.NewCommonConnectsRepo(options.OptInstance)
+	global.CommonConnectRepoInst.Redis = myredis.InitRedis(options.OptInstance.Redis)
+}
+
+func TestGenOrderNo(t *testing.T) {
+
+	ctx := contextutil.MakeTraceCtx(context.Background())
+	if err := GenOrderNo(ctx); err != nil {
+		t.Errorf("GenOrderNo() error = %v", err)
+		return
+	}
+
+}
+
+func TestGenOrderNo_Sub(t *testing.T) {
+
+}

+ 53 - 0
internal/server/domain/domainservice/validate.go

@@ -0,0 +1,53 @@
+package domainservice
+
+import (
+	"context"
+	"mime/multipart"
+	"regexp"
+	"strings"
+
+	"Cold_Logistic/internal/pkg/common/codex"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"github.com/dlclark/regexp2"
+	validation "github.com/go-ozzo/ozzo-validation/v4"
+)
+
+func ValidationAccountNum() validation.RuleWithContextFunc {
+	return func(ctx context.Context, value interface{}) error {
+		reg, err := regexp2.Compile(`^((?=.*[0-9])(?=.*[a-zA-Z]).{6,50})$`, 0)
+		if err != nil {
+			return err
+		}
+		m, err := reg.MatchString(value.(string))
+		if err != nil {
+			return err
+		}
+		if !m {
+			return errors.New("可以是手机号码或者包含字符和数字,至少6位")
+		}
+		return nil
+	}
+}
+
+func ValidationIdentityNumber() validation.RuleWithContextFunc {
+	return func(ctx context.Context, value interface{}) error {
+		regx := "((^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x)))|(^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]))"
+
+		err := validation.Validate(value, validation.Match(regexp.MustCompile(regx)).Error("身份证号码不合规"))
+		if err != nil {
+			return err
+		}
+		return nil
+	}
+}
+
+func ValidationExcelFile(fileHeader *multipart.FileHeader, limitSize int64) error {
+	if !strings.HasSuffix(fileHeader.Filename, "xlsx") {
+		return errors.WithCode(codex.ErrParamValidate, "文件扩展名必须是xlsx")
+	}
+	if fileHeader.Size > limitSize {
+		return errors.WithCode(codex.ErrParamValidate, "文件大小不能超过10M")
+	}
+	return nil
+}

+ 229 - 0
internal/server/infra/dao/a_baseStore.go

@@ -0,0 +1,229 @@
+package dao
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"time"
+
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gorm.io/gorm"
+
+	"Cold_Logistic/internal/pkg/common/global"
+
+	"Cold_Logistic/internal/server/infra/models"
+)
+
+type DbBaseStore interface {
+	Create(ctx context.Context, value models.BaseEntity) error
+	Save(ctx context.Context, value models.BaseEntity, omit ...string) error
+	UpdateById(ctx context.Context, value models.BaseEntity, selected ...string) error
+	FirstById(ctx context.Context, dest models.BaseEntity, id int) error
+	GetById(ctx context.Context, dest models.BaseEntity, id int) error
+	GetByIds(ctx context.Context, dest, ids interface{}) error
+	DeleteByIds(ctx context.Context, ids interface{}) error
+	GetIntValueMapByIds(ctx context.Context, ids []int, fieldName string) (map[int]int, error)
+	GetStringValueMapByIds(ctx context.Context, ids []int, fieldName string) (map[int]string, error)
+}
+
+var _ DbBaseStore = &dbBase{}
+
+type dbBase struct {
+	store      *DataStore
+	baseEntity models.BaseEntity
+}
+
+func (ds *dbBase) Create(ctx context.Context, m models.BaseEntity) error {
+	db := ds.store.optionDB(ctx)
+	v := reflect.ValueOf(m).Elem()
+	if v.CanAddr() {
+		accountId := global.GetTokenInfoFromContext(ctx).AccountId
+		if field := v.FieldByName("CreatedTime"); field.IsValid() {
+			field.Set(reflect.ValueOf(models.MyTime{Time: time.Now()}))
+		}
+		if field := v.FieldByName("Deleted"); field.IsValid() {
+			field.SetInt(models.DeleteNo)
+		}
+		if field := v.FieldByName("CreatedBy"); field.IsValid() && accountId != 0 {
+			field.Set(reflect.ValueOf(accountId))
+		}
+	}
+
+	return db.Table(m.TableName()).Create(m).Error
+}
+
+func (ds *dbBase) Save(ctx context.Context, m models.BaseEntity, omit ...string) error {
+	db := ds.store.optionDB(ctx)
+	v := reflect.ValueOf(m).Elem()
+	if v.CanAddr() {
+		accountId := global.GetTokenInfoFromContext(ctx).AccountId
+		if field := v.FieldByName("Id"); field.IsValid() && field.IsZero() {
+			if field := v.FieldByName("CreatedTime"); field.IsValid() {
+				field.Set(reflect.ValueOf(models.MyTime{Time: time.Now()}))
+			}
+			if field := v.FieldByName("CreatedBy"); field.IsValid() && accountId != 0 {
+				field.Set(reflect.ValueOf(accountId))
+			}
+			if field := v.FieldByName("Deleted"); field.IsValid() {
+				field.SetInt(models.DeleteNo)
+			}
+		} else {
+
+			if field := v.FieldByName("UpdatedTime"); field.IsValid() {
+				field.Set(reflect.ValueOf(models.MyTime{Time: time.Now()}))
+			}
+			if field := v.FieldByName("UpdatedBy"); field.IsValid() && accountId != 0 {
+				field.Set(reflect.ValueOf(accountId))
+			}
+		}
+	}
+	return db.Table(m.TableName()).Omit(omit...).Save(m).Error
+}
+
+func (ds *dbBase) UpdateById(ctx context.Context, m models.BaseEntity, selected ...string) error {
+	db := ds.store.optionDB(ctx)
+	v := reflect.ValueOf(m).Elem()
+
+	if v.CanAddr() {
+		accountId := global.GetTokenInfoFromContext(ctx).AccountId
+
+		if field := v.FieldByName("UpdatedTime"); field.IsValid() {
+			field.Set(reflect.ValueOf(models.MyTime{Time: time.Now()}))
+			if len(selected) > 0 {
+				selected = append(selected, "UpdatedTime")
+			}
+		}
+		if field := v.FieldByName("UpdatedBy"); field.IsValid() && accountId != 0 {
+			field.Set(reflect.ValueOf(accountId))
+			if len(selected) > 0 {
+				selected = append(selected, "UpdatedBy")
+			}
+		}
+
+	}
+
+	return db.Table(m.TableName()).Select(selected).Updates(m).Error
+}
+
+func (ds *dbBase) FirstById(ctx context.Context, dest models.BaseEntity, id int) error {
+	return ds.firstByOptions(ctx, dest, ds.store.withByID(id), ds.store.withByNotDeleted())
+}
+
+func (ds *dbBase) GetById(ctx context.Context, dest models.BaseEntity, id int) error {
+	return ds.findByOptions(ctx, dest, ds.store.withByID(id), ds.store.withByNotDeleted())
+}
+
+func (ds *dbBase) GetByIds(ctx context.Context, dest, ids interface{}) error {
+	db := ds.store.optionDB(ctx)
+	err := db.Table(ds.baseEntity.TableName()).Where("deleted = ?", models.DeleteNo).
+		Where("id in (?)", ids).
+		Find(dest).Error
+	return err
+}
+
+func (ds *dbBase) DeleteByIds(ctx context.Context, ids interface{}) error {
+	destVal := reflect.ValueOf(ds.baseEntity)
+	if destVal.Kind() == reflect.Ptr {
+		destVal = destVal.Elem()
+	}
+	v := reflect.New(destVal.Type())
+	v = v.Elem()
+	if field := v.FieldByName("DeletedTime"); field.IsValid() {
+		field.Set(reflect.ValueOf(models.MyTime{Time: time.Now()}))
+	}
+	if field := v.FieldByName("DeletedBy"); field.IsValid() {
+		field.Set(reflect.ValueOf(global.GetTokenInfoFromContext(ctx).AccountId))
+	}
+	if field := v.FieldByName("Deleted"); field.IsValid() {
+		field.Set(reflect.ValueOf(models.DeleteYes))
+	}
+	db := ds.store.optionDB(ctx)
+	err := db.Table(ds.baseEntity.TableName()).
+		Where("deleted = ?", models.DeleteNo).
+		Where("id IN (?)", ids).
+		Updates(v.Interface()).Error
+	return err
+}
+
+func (ds *dbBase) GetIntValueMapByIds(ctx context.Context, ids []int, fieldName string) (map[int]int, error) {
+	res := make(map[int]int, len(ids))
+	if len(ids) == 0 {
+		return res, nil
+	}
+
+	slicePtr := ds.makeSlice(len(ids))
+	err := ds.findByOptions(ctx, slicePtr.Interface(),
+		ds.store.withByNotDeleted(),
+		ds.store.withByColumnInVal("id", ids),
+		ds.store.withBySelects("id", fieldName))
+	if err != nil {
+		return nil, err
+	}
+
+	sliceVal := slicePtr.Elem()
+	for i := 0; i < sliceVal.Len(); i++ {
+		elem := sliceVal.Index(i)
+		if fieldValue := elem.FieldByName(fieldName); fieldValue.IsValid() {
+			res[elem.FieldByName("Id").Interface().(int)] = fieldValue.Interface().(int)
+		} else {
+			return nil, errors.New(fmt.Sprintf("fieldName %s not found", fieldName))
+		}
+	}
+
+	return res, nil
+}
+
+func (ds *dbBase) GetStringValueMapByIds(ctx context.Context, ids []int, fieldName string) (map[int]string, error) {
+	res := make(map[int]string, len(ids))
+	if len(ids) == 0 {
+		return res, nil
+	}
+
+	slicePtr := ds.makeSlice(len(ids))
+	err := ds.findByOptions(ctx, slicePtr.Interface(),
+		ds.store.withByNotDeleted(),
+		ds.store.withByColumnInVal("id", ids),
+		ds.store.withBySelects("id", fieldName))
+	if err != nil {
+		return nil, err
+	}
+
+	sliceVal := slicePtr.Elem()
+	for i := 0; i < sliceVal.Len(); i++ {
+		elem := sliceVal.Index(i)
+		if fieldValue := elem.FieldByName(fieldName); fieldValue.IsValid() {
+			res[elem.FieldByName("Id").Interface().(int)] = fieldValue.Interface().(string)
+		} else {
+			return nil, errors.New(fmt.Sprintf("fieldName %s not found", fieldName))
+		}
+	}
+
+	return res, nil
+}
+
+func (ds *dbBase) makeSlice(cap int) reflect.Value {
+	elemType := reflect.TypeOf(ds.baseEntity)
+	if elemType.Kind() == reflect.Ptr {
+		elemType = elemType.Elem()
+	}
+	slice := reflect.MakeSlice(reflect.SliceOf(elemType), 0, cap)
+	results := reflect.New(slice.Type())
+	results.Elem().Set(slice)
+	return results
+}
+
+func (ds *dbBase) firstByOptions(ctx context.Context, m models.BaseEntity, opts ...dbOption) error {
+	db := ds.store.optionDB(ctx, opts...)
+
+	err := db.Table(m.TableName()).First(m).Error
+	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+		return errors.WithStackOnce(err)
+	}
+	return err
+}
+
+func (ds *dbBase) findByOptions(ctx context.Context, dest interface{}, opts ...dbOption) error {
+	db := ds.store.optionDB(ctx, opts...)
+	err := db.Table(ds.baseEntity.TableName()).Find(dest).Error
+	return err
+}

+ 113 - 0
internal/server/infra/dao/a_dataStore.go

@@ -0,0 +1,113 @@
+package dao
+
+import (
+	"Cold_Logistic/internal/pkg/common/constant"
+	"Cold_Logistic/internal/pkg/common/global"
+	"context"
+
+	"gorm.io/gorm"
+	"gorm.io/gorm/clause"
+
+	"Cold_Logistic/internal/server/infra/models"
+)
+
+type DataStore struct {
+	db *gorm.DB
+}
+
+type dbOption func(*gorm.DB) *gorm.DB
+
+func NewDataStore(db *gorm.DB) *DataStore {
+	return &DataStore{db: db}
+}
+
+type contextTxKey struct{}
+
+func (ds *DataStore) InTx(ctx context.Context, fn func(ctx context.Context) error) error {
+	return ds.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
+		ctx = context.WithValue(ctx, contextTxKey{}, tx)
+		return fn(ctx)
+	})
+}
+
+func (ds *DataStore) GetDB(ctx context.Context) *gorm.DB {
+	tx, ok := ctx.Value(contextTxKey{}).(*gorm.DB)
+	if ok {
+		return tx
+	}
+	return ds.db
+}
+
+func (ds *DataStore) withByID(id int) dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Where("id = ?", id)
+	}
+}
+
+func (ds *DataStore) withByColumn(column string, val interface{}) dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Where(column+" = ?", val)
+	}
+}
+
+func (ds *DataStore) withByColumnInVal(column string, val interface{}) dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Where(column+" in (?)", val)
+	}
+}
+
+func (ds *DataStore) withBySelects(filed ...string) dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Select(filed)
+	}
+}
+
+func (ds *DataStore) withByNotDeleted() dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Where("deleted = ?", models.DeleteNo)
+	}
+}
+
+func (ds *DataStore) withForUpdate() dbOption {
+	return func(db *gorm.DB) *gorm.DB {
+		return db.Clauses(clause.Locking{Strength: "UPDATE"})
+	}
+}
+
+func (ds *DataStore) optionDB(ctx context.Context, opts ...dbOption) *gorm.DB {
+	db := ds.GetDB(ctx).WithContext(ctx)
+	// db := ds.db.WithContext(ctx)
+	for _, opt := range opts {
+		db = opt(db)
+	}
+	return db
+}
+
+func (ds *DataStore) withAccountDataPermis(ctx context.Context, column string) dbOption {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.AccountType == constant.AccountApplet {
+		return func(db *gorm.DB) *gorm.DB {
+			return db.Where(column+" = ?", tokenInfo.AccountId)
+		}
+	}
+
+	// 默认
+	return func(db *gorm.DB) *gorm.DB {
+		return db
+	}
+}
+
+// 数据权限
+func (ds *DataStore) withCompanyDataPermis(ctx context.Context, column string) dbOption {
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	if tokenInfo.AccountType == constant.AccountPlatform {
+		return func(db *gorm.DB) *gorm.DB {
+			return db.Where(column+" = ?", tokenInfo.UsePid)
+		}
+	}
+
+	// 默认
+	return func(db *gorm.DB) *gorm.DB {
+		return db
+	}
+}

+ 130 - 0
internal/server/infra/dao/account.go

@@ -0,0 +1,130 @@
+package dao
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"time"
+)
+
+// AccountStore 小程序账号表
+type AccountStore interface {
+	DbBaseStore
+	BatchSave(ctx context.Context, values []*models.Account, omit ...string) error
+	GetMapByIds(ctx context.Context, ids []int, omit ...string) (map[int]models.Account, error)
+	FindByOpenid(ctx context.Context, openid string, accType int) (models.Account, error)
+	FindByUuid(ctx context.Context, uuid string) (models.Account, error)
+	FindByUuids(ctx context.Context, uuid []string) (map[string]models.Account, error)
+	FindTokenKeyById(ctx context.Context, id int) (string, error)
+}
+
+var _ AccountStore = &account{}
+
+type account struct {
+	dbBase
+}
+
+func newAccount(ds *DataStore) *account {
+	return &account{dbBase: dbBase{
+		store:      ds,
+		baseEntity: &models.Account{},
+	}}
+}
+
+func (ds *DataStore) Account() AccountStore {
+	return newAccount(ds)
+}
+
+func (a *account) BatchSave(ctx context.Context, values []*models.Account, omit ...string) error {
+	if len(values) == 0 {
+		return nil
+	}
+	db := a.store.optionDB(ctx)
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+
+	for i := range values {
+		if values[i].Id == 0 {
+			values[i].CreatedBy = tokenInfo.AccountId
+			values[i].CreatedTime.Time = time.Now()
+			values[i].Deleted = models.DeleteNo
+		} else {
+			values[i].UpdatedBy = tokenInfo.AccountId
+			values[i].UpdatedTime.Time = time.Now()
+		}
+	}
+	return db.Table(a.baseEntity.TableName()).Omit(omit...).Save(&values).Error
+}
+
+func (a *account) GetMapByIds(ctx context.Context, ids []int, omit ...string) (map[int]models.Account, error) {
+	res := make(map[int]models.Account, len(ids))
+	if len(ids) == 0 {
+		return res, nil
+	}
+	var list []models.Account
+
+	db := a.store.optionDB(ctx)
+	err := db.Table(a.baseEntity.TableName()).
+		Where("deleted = ?", models.DeleteNo).
+		Where("id IN (?)", ids).
+		Omit(omit...).
+		Find(&list).Error
+
+	if err != nil {
+		return res, err
+	}
+
+	for i := range list {
+		res[list[i].Id] = list[i]
+	}
+	return res, nil
+}
+
+func (a *account) FindByOpenid(ctx context.Context, openid string, accType int) (models.Account, error) {
+	db := a.store.optionDB(ctx)
+	ent := models.Account{}
+	err := db.Model(a.baseEntity).Where("deleted = ?", models.DeleteNo).
+		Where("openid = ? AND account_type = ?", openid, accType).
+		Find(&ent).Error
+	if err != nil {
+		return ent, errors.WithStackOnce(err)
+	}
+	return ent, nil
+}
+
+func (a *account) FindByUuid(ctx context.Context, uuid string) (models.Account, error) {
+	db := a.store.optionDB(ctx)
+	ent := models.Account{}
+	err := db.Model(a.baseEntity).Where("deleted = ?", models.DeleteNo).
+		Where("uuid = ?", uuid).
+		Find(&ent).Limit(1).Error
+	if err != nil {
+		return ent, errors.WithStackOnce(err)
+	}
+	return ent, nil
+}
+
+func (a *account) FindByUuids(ctx context.Context, uuid []string) (map[string]models.Account, error) {
+	db := a.store.optionDB(ctx)
+	ent := make([]models.Account, 0, len(uuid))
+	err := db.Model(a.baseEntity).Where("deleted = ?", models.DeleteNo).
+		Where("uuid IN(?)", uuid).
+		Find(&ent).Error
+	if err != nil {
+		return nil, errors.WithStackOnce(err)
+	}
+	ret := make(map[string]models.Account, len(ent))
+	for _, v := range ent {
+		ret[v.Uuid] = v
+	}
+	return ret, nil
+}
+
+func (a *account) FindTokenKeyById(ctx context.Context, id int) (string, error) {
+	db := a.store.optionDB(ctx)
+	var key string
+	err := db.Model(a.baseEntity).Where("deleted = ?", models.DeleteNo).
+		Where("id = ?", id).
+		Pluck("tokey", &key).Error
+	return key, errors.WithStackOnce(err)
+}

+ 179 - 0
internal/server/infra/dao/address_book.go

@@ -0,0 +1,179 @@
+package dao
+
+import (
+	"Cold_Logistic/internal/pkg/common/global"
+	"Cold_Logistic/internal/server/infra/models"
+	"context"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/core"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/errors"
+	"gitee.com/hexingqq/go-backend/pkg/contrib/util/sliceutil"
+	"time"
+)
+
+// AddressBookStore 发件人表
+type AddressBookStore interface {
+	DbBaseStore
+	BatchSave(ctx context.Context, values []*models.AddressBook, omit ...string) error
+	GetMapByIds(ctx context.Context, ids []int, omit ...string) (map[int]models.AddressBook, error)
+	Page(ctx context.Context, dto AddressBookPageDTO) ([]AddressBookPageVO, int64, error)
+	UpdateDefaultByCreateBy(ctx context.Context, isDefault int, excludeId ...int) error
+	FindByIds(ctx context.Context, ids []int) ([]models.AddressBook, error)
+}
+
+var _ AddressBookStore = &addressBook{}
+
+type addressBook struct {
+	dbBase
+}
+
+func newAddressBook(ds *DataStore) *addressBook {
+	return &addressBook{dbBase: dbBase{
+		store:      ds,
+		baseEntity: &models.AddressBook{},
+	}}
+}
+
+func (ds *DataStore) AddressBook() AddressBookStore {
+	return newAddressBook(ds)
+}
+
+func (a *addressBook) BatchSave(ctx context.Context, values []*models.AddressBook, omit ...string) error {
+	if len(values) == 0 {
+		return nil
+	}
+	db := a.store.optionDB(ctx)
+	tokenInfo := global.GetTokenInfoFromContext(ctx)
+	for i := range values {
+		if values[i].Id == 0 {
+			values[i].CreatedBy = tokenInfo.AccountId
+			values[i].CreatedTime.Time = time.Now()
+			values[i].Deleted = models.DeleteNo
+		} else {
+			values[i].UpdatedBy = tokenInfo.AccountId
+			values[i].UpdatedTime.Time = time.Now()
+		}
+	}
+	return db.Table(a.baseEntity.TableName()).Omit(omit...).Save(&values).Error
+}
+
+func (a *addressBook) GetMapByIds(ctx context.Context, ids []int, omit ...string) (map[int]models.AddressBook, error) {
+	res := make(map[int]models.AddressBook, len(ids))
+	if len(ids) == 0 {
+		return res, nil
+	}
+	var list []models.AddressBook
+
+	db := a.store.optionDB(ctx)
+	err := db.Table(a.baseEntity.TableName()).
+		Where("deleted = ?", models.DeleteNo).
+		Where("id IN (?)", ids).
+		Omit(omit...).
+		Find(&list).Error
+
+	if err != nil {
+		return res, err
+	}
+
+	for i := range list {
+		res[list[i].Id] = list[i]
+	}
+	return res, nil
+}
+
+type AddressBookPageDTO struct {
+	Page        core.Page
+	AddressType string // 地址类型
+}
+
+type AddressBookPageVO struct {
+	AddressId   int    `gorm:"column:id" json:"addressId"`             //
+	AddressType string `gorm:"column:address_type" json:"addressType"` // 地址类型:sender-发货人 consignee-收货人
+	Name        string `gorm:"column:name" json:"name"`                // 姓名
+	Phone       string `gorm:"column:phone" json:"phone"`              // 联系电话
+	ProvinceId  int    `gorm:"column:province_id" json:"provinceId"`   // 省Id
+	Province    string `gorm:"-" json:"province"`                      // 省名称
+	CityId      int    `gorm:"column:city_id" json:"cityId"`           // 市Id
+	City        string `gorm:"-" json:"city"`                          // 市名称
+	RegionId    int    `gorm:"column:region_id" json:"regionId"`       // 区Id
+	Region      string `gorm:"-" json:"region"`                        // 地区名称
+	Address     string `gorm:"column:address" json:"address"`          // 详细地址
+	IsDefault   int    `gorm:"column:is_default" json:"isDefault"`     // 是否默认:1-是 2-否
+
+}
+
+func (a *addressBook) Page(ctx context.Context, dto AddressBookPageDTO) ([]AddressBookPageVO, int64, error) {
+	db := a.store.optionDB(ctx, a.store.withAccountDataPermis(ctx, "created_by"))
+	stmt := db.Model(&models.AddressBook{}).
+		Where("deleted = ?", models.DeleteNo).
+		Where("address_type = ?", dto.AddressType)
+
+	stmt.Select("id, address_type, name, phone, province_id, city_id, region_id, address, is_default")
+	var total int64
+	var ret []AddressBookPageVO
+	if err := stmt.Count(&total).Error; err != nil {
+		return nil, 0, errors.WithStackOnce(err)
+	}
+
+	if total == 0 {
+		return ret, total, nil
+	}
+
+	stmt.Limit(dto.Page.Size).Offset(dto.Page.Offset)
+	stmt.Order("is_default ASC, id DESC")
+	if err := stmt.Find(&ret).Error; err != nil {
+		return nil, 0, errors.WithStackOnce(err)
+	}
+
+	regionIds := make([]int, 0, total/3)
+	for _, v := range ret {
+		if v.ProvinceId > 0 && !sliceutil.ContainInt(regionIds, v.ProvinceId) {
+			regionIds = append(regionIds, v.ProvinceId)
+		}
+		if v.CityId > 0 && !sliceutil.ContainInt(regionIds, v.CityId) {
+			regionIds = append(regionIds, v.CityId)
+		}
+		if v.RegionId > 0 && !sliceutil.ContainInt(regionIds, v.RegionId) {
+			regionIds = append(regionIds, v.RegionId)
+		}
+	}
+
+	regionName, err := a.store.Region().FindNameMapByIds(ctx, regionIds)
+	if err != nil {
+		return nil, 0, errors.WithStackOnce(err)
+	}
+	for i := range ret {
+		ret[i].Province = regionName[ret[i].ProvinceId]
+		ret[i].City = regionName[ret[i].CityId]
+		ret[i].Region = regionName[ret[i].RegionId]
+	}
+
+	return ret, total, nil
+}
+
+// UpdateDefaultByCreateBy 修改我的默认选中
+func (a *addressBook) UpdateDefaultByCreateBy(ctx context.Context, isDefault int, excludeId ...int) error {
+	accId := global.GetTokenInfoFromContext(ctx).AccountId
+	ent := models.AddressBook{
+		UpdatedTime: models.NewMyTime(time.Now()),
+		UpdatedBy:   accId,
+		IsDefault:   isDefault,
+	}
+	stmt := a.store.optionDB(ctx).Table(a.baseEntity.TableName()).
+		Where("deleted = ?", models.DeleteNo).
+		Where("created_by = ?", accId)
+	if len(excludeId) > 0 {
+		stmt.Where("id NOT IN(?)", excludeId)
+	}
+	err := stmt.Updates(&ent).Error
+	return errors.WithStackOnce(err)
+}
+
+// FindByIds id批量查
+func (a *addressBook) FindByIds(ctx context.Context, ids []int) ([]models.AddressBook, error) {
+	ret := make([]models.AddressBook, 0, len(ids))
+	err := a.store.optionDB(ctx).Table(a.baseEntity.TableName()).
+		Where("deleted = ?", models.DeleteNo).
+		Where("id IN(?)", ids).Find(&ret).Error
+
+	return ret, errors.WithStackOnce(err)
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio