refactor(card_redeem): 重构卡密兑换模块以支持多品类下单
- 更新 gerror 包引用路径至 v2 版本- 新增 RedeemOrderCardCategory 类型定义,支持 apple、cTrip、walmart 品类- 修改 CardRedeemCookiePlaceOrderInput 结构体字段,使用 OrderId 和 Category 替代 BankOrderId - 调整 PlaceOrder 控制器逻辑,移除订单查询及金额校验,直接使用请求参数下单-优化 JD 客户端 AppleRecharge 方法实现,更新响应数据解析逻辑 - 升级 go.mod 中 otel 相关依赖版本至 v1.38.0 - 清理 go.mod 和 go.sum 中的冗余依赖项- 重命名 QueryCard 方法注释以提高可读性
This commit is contained in:
56
CODEBUDDY.md
Normal file
56
CODEBUDDY.md
Normal file
@@ -0,0 +1,56 @@
|
||||
卡密兑换平台
|
||||
|
||||
# CODEBUDDY.md
|
||||
|
||||
Commands
|
||||
|
||||
- make build
|
||||
- go run main.go
|
||||
- make up
|
||||
- go test ./...
|
||||
- go test -v ./internal/logic/...
|
||||
- make image
|
||||
- make image.push
|
||||
|
||||
Architecture
|
||||
|
||||
- Entry: main.go initializes OpenTelemetry and starts internal/cmd.Main
|
||||
- HTTP server and routes: internal/cmd/cmd.go binds controllers under /api with middleware
|
||||
- Controllers: internal/controller/* grouped by domains (order, merchant, channel, road, road_pool, sys_user_login,
|
||||
sysUser, sys_payment, user_center, restriction, card_info_*) expose HTTP endpoints
|
||||
- Business logic: internal/logic/* implements domain logic; heavy use of GoFrame generators (dao/service/enums)
|
||||
- Data access: internal/dao, internal/model/{do,entity} generated by GoFrame DAO/ORM; MySQL driver enabled in main.go
|
||||
- SystemV2: internal/systemV2/* newer modules with dao/logic/model/service mirroring v1
|
||||
- Utilities: utility/* for config, cache (Redis), cron, otel tracing, limiter, notify, token, integrations (tmall, jd,
|
||||
walmart, ctrip, originalJd)
|
||||
- Middleware: internal/middleware/* for auth and error handling
|
||||
- Boot: internal/boot for app init; packed resources under internal/packed
|
||||
|
||||
Environments & Running
|
||||
|
||||
- Configuration via GoFrame config files under manifest/config and env vars (e.g., serverName)
|
||||
- Docker Compose profiles provided in docker-compose.yml; backend maps 12401->22401 and mounts manifest/config and logs
|
||||
- Make tasks rely on GoFrame CLI (gf); Makefile includes hack/hack.mk and auto-installs gf if missing
|
||||
|
||||
Code Generation Conventions
|
||||
|
||||
- Controllers: make ctrl
|
||||
- DAO/DO/Entity: make dao
|
||||
- Services: make service
|
||||
- Enums: make enums
|
||||
- Protobuf: make pb / make pbentity
|
||||
|
||||
Testing Notes
|
||||
|
||||
- Focused tests exist in internal/logic/* (e.g., card_apple_account, card_t_mall_order, limiter)
|
||||
- Use go test -run to target specific tests when needed
|
||||
|
||||
Observability
|
||||
|
||||
- OpenTelemetry configured in main.go with service name composed from env serverName; utility/otel handles setup
|
||||
- Health check endpoints and monitor tasks registered via internal/controller/monitor and utility/monitor
|
||||
|
||||
Deployment
|
||||
|
||||
- Docker image build/tag via make image; push with make image.push
|
||||
- Kubernetes kustomize deploy supported via make deploy with overlays under manifest/deploy/kustomize
|
||||
@@ -29,9 +29,10 @@ type OrderListRes struct {
|
||||
// PlaceOrderReq 下单接口
|
||||
type PlaceOrderReq struct {
|
||||
g.Meta `path:"/cookieInfo/jd/order/placeOrder" tags:"京东ck订单" method:"post" summary:"下单"`
|
||||
MerchantOrderId string `json:"merchantOrderId" v:"required#merchantOrderId不能为空" description:"银行订单id"`
|
||||
OrderAmount float64 `json:"orderAmount" v:"required#orderAmount不能为空" description:"订单金额"`
|
||||
UserAgent string `json:"userAgent" description:"用户代理"`
|
||||
MerchantOrderId string `json:"merchantOrderId" v:"required#merchantOrderId不能为空" description:"银行订单id"`
|
||||
OrderAmount float64 `json:"orderAmount" v:"required#orderAmount不能为空" description:"订单金额"`
|
||||
UserAgent string `json:"userAgent" description:"用户代理"`
|
||||
Category consts.RedeemOrderCardCategory `json:"category" v:"required|in:apple,cTrip,walmart#类型不能为空|类型不正确" description:"分类"`
|
||||
}
|
||||
|
||||
type PlaceOrderRes struct {
|
||||
|
||||
@@ -3,8 +3,8 @@ package v1
|
||||
import (
|
||||
"kami/internal/model/entity"
|
||||
|
||||
"github.com/gogf/gf/os/gtime"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
)
|
||||
|
||||
type LoginUserRecord struct {
|
||||
|
||||
5
go.mod
5
go.mod
@@ -7,7 +7,6 @@ require (
|
||||
github.com/bytedance/sonic v1.14.1
|
||||
github.com/casbin/casbin/v2 v2.127.0
|
||||
github.com/duke-git/lancet/v2 v2.3.7
|
||||
github.com/gogf/gf v1.16.9
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3
|
||||
github.com/gogf/gf/contrib/metric/otelmetric/v2 v2.9.3
|
||||
github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.3
|
||||
@@ -25,7 +24,7 @@ require (
|
||||
github.com/xuri/excelize/v2 v2.9.1
|
||||
go.opentelemetry.io/otel v1.38.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0
|
||||
go.opentelemetry.io/otel/log v0.14.0
|
||||
go.opentelemetry.io/otel/sdk v1.38.0
|
||||
go.opentelemetry.io/otel/sdk/log v0.14.0
|
||||
@@ -88,7 +87,7 @@ require (
|
||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/metric v1.38.0 // indirect
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
|
||||
|
||||
36
go.sum
36
go.sum
@@ -1,6 +1,5 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/Lofanmi/pinyin-golang v0.0.0-20250305082105-87d20ae3d695 h1:fJzpypkkFwbTiet3kXtZf8BZQi5bk27BGGR0RNkF8Ac=
|
||||
@@ -29,8 +28,6 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x
|
||||
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/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/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
|
||||
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
|
||||
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
||||
@@ -44,10 +41,8 @@ github.com/duke-git/lancet/v2 v2.3.7 h1:nnNBA9KyoqwbPm4nFmEFVIbXeAmpqf6IDCH45+HH
|
||||
github.com/duke-git/lancet/v2 v2.3.7/go.mod h1:zGa2R4xswg6EG9I6WnyubDbFO/+A/RROxIbXcwryTsc=
|
||||
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
|
||||
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
|
||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
||||
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
@@ -57,11 +52,8 @@ 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.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
|
||||
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||
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/gogf/gf/contrib/drivers/mysql/v2 v2.9.3 h1:P4jrnp+Vmh3kDeaH/kyHPI6rfoMmQD+sPJa716aMbS0=
|
||||
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3/go.mod h1:yEhfx78wgpxUJhH9C9bWJ7I3JLcVCzUg11A4ORYTKeg=
|
||||
github.com/gogf/gf/contrib/metric/otelmetric/v2 v2.9.3 h1:PcB+Ugv00fxFGGUyLDRtJ/XJ+pQv5tKku7sZWn8nqJE=
|
||||
@@ -78,8 +70,6 @@ github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
|
||||
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/gomodule/redigo v1.8.5 h1:nRAxCa+SVsyjSBrtZmG/cqb6VbTmuRzpg/PoTFlpumc=
|
||||
github.com/gomodule/redigo v1.8.5/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
|
||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
@@ -87,10 +77,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78=
|
||||
github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
|
||||
github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
|
||||
@@ -111,13 +99,10 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
|
||||
github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
|
||||
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
|
||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
|
||||
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
|
||||
github.com/mojocn/base64Captcha v1.3.8 h1:rrN9BhCwXKS8ht1e21kvR3iTaMgf4qPC9sRoV52bqEg=
|
||||
@@ -130,7 +115,6 @@ github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5
|
||||
github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
|
||||
github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
|
||||
github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g=
|
||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
||||
github.com/olekukonko/tablewriter v1.0.9 h1:XGwRsYLC2bY7bNd93Dk51bcPZksWZmLYuaTHR0FqfL8=
|
||||
github.com/olekukonko/tablewriter v1.0.9/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
@@ -171,8 +155,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
||||
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/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
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=
|
||||
@@ -203,15 +185,14 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0 h1:ZIt0ya9/y4WyRIzfLC8hQRRsWg0J9M9GyaGtIMiElZI=
|
||||
go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0/go.mod h1:F1aJ9VuiKWOlWwKdTYDUp1aoS0HzQxg38/VLxKmhm5U=
|
||||
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
|
||||
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
|
||||
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0 h1:OMqPldHt79PqWKOMYIAQs3CxAi7RLgPxwfFSwr4ZxtM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.14.0/go.mod h1:1biG4qiqTxKiUCtoWDPpL3fB3KxVwCiGw81j3nKMuHE=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk=
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.46.0 h1:I8WIFXR351FoLJYuloU4EgXbtNX2URfU/85pUPheIEQ=
|
||||
go.opentelemetry.io/otel/exporters/prometheus v0.46.0/go.mod h1:ztwVUHe5DTR/1v7PeuGRnU5Bbd4QKYwApWmuutKsJSs=
|
||||
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
|
||||
@@ -226,7 +207,6 @@ go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4Y
|
||||
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
|
||||
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
|
||||
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
|
||||
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
|
||||
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
|
||||
@@ -255,7 +235,6 @@ golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-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=
|
||||
@@ -273,12 +252,8 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -301,7 +276,6 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.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=
|
||||
@@ -335,8 +309,6 @@ google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXn
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
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=
|
||||
|
||||
@@ -373,6 +373,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+n
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||
@@ -426,6 +430,7 @@ golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY=
|
||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
|
||||
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
|
||||
|
||||
@@ -242,3 +242,11 @@ const (
|
||||
RedeemOrderCallbackStatusSuccess RedeemOrderCallbackStatus = 1
|
||||
RedeemOrderCallbackStatusFail RedeemOrderCallbackStatus = 2
|
||||
)
|
||||
|
||||
type RedeemOrderCardCategory string
|
||||
|
||||
const (
|
||||
RedeemOrderCardCategoryApple RedeemOrderCardCategory = "apple"
|
||||
RedeemOrderCardCategoryCTrip RedeemOrderCardCategory = "cTrip"
|
||||
RedeemOrderCardCategoryWalmart RedeemOrderCardCategory = "walmart"
|
||||
)
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"kami/internal/errHandler"
|
||||
tmall "kami/utility/integration/tmall/api"
|
||||
|
||||
"github.com/gogf/gf/errors/gerror"
|
||||
"github.com/gogf/gf/v2/errors/gcode"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
"kami/internal/service"
|
||||
|
||||
"github.com/duke-git/lancet/v2/slice"
|
||||
"github.com/gogf/gf/errors/gcode"
|
||||
"github.com/gogf/gf/v2/errors/gcode"
|
||||
)
|
||||
|
||||
func (c *ControllerV1) AccountList(ctx context.Context, req *v1.AccountListReq) (res *v1.AccountListRes, err error) {
|
||||
|
||||
@@ -14,34 +14,24 @@ import (
|
||||
)
|
||||
|
||||
func (c *ControllerV1) PlaceOrder(ctx context.Context, req *v1.PlaceOrderReq) (res *v1.PlaceOrderRes, err error) {
|
||||
// 查询订单是否存在
|
||||
order, err := service.OrderSummary().GetOneByMerchantUid(ctx, req.MerchantOrderId)
|
||||
if err != nil || order.Id == 0 {
|
||||
glog.Error(ctx, "订单不存在", "merchantOrderId", req.MerchantOrderId, err)
|
||||
return nil, gerror.NewCode(gcode.CodeNotFound, "订单不存在")
|
||||
}
|
||||
|
||||
orderAmount, ok := order.ShowAmount.Float64()
|
||||
if !ok {
|
||||
glog.Error(ctx, "订单金额错误", "merchantOrderId", req.MerchantOrderId, "orderAmount", order.ShowAmount)
|
||||
return nil, gerror.NewCode(gcode.CodeInvalidRequest, "订单金额错误")
|
||||
}
|
||||
|
||||
glog.Info(ctx, "下单", "merchantOrderId", req.MerchantOrderId, "bankOrderId", order.BankOrderId, "orderAmount", orderAmount)
|
||||
|
||||
// 下单
|
||||
orderInfo, err := service.CardRedeemCookie().PlaceOrder(ctx, &model.CardRedeemCookiePlaceOrderInput{
|
||||
BankOrderId: order.BankOrderId,
|
||||
OrderAmount: orderAmount,
|
||||
OrderId: req.MerchantOrderId,
|
||||
OrderAmount: req.OrderAmount,
|
||||
UserAgent: req.UserAgent,
|
||||
Category: req.Category,
|
||||
}, nil)
|
||||
|
||||
if err != nil {
|
||||
glog.Error(ctx, "下单失败", "merchantOrderId", req.MerchantOrderId, err)
|
||||
glog.Error(ctx, "下单失败", req.MerchantOrderId, err)
|
||||
return res, gerror.NewCode(gcode.CodeOperationFailed, "下单失败")
|
||||
}
|
||||
if orderInfo.JdOrder.WebPayLink == "" {
|
||||
glog.Error(ctx, "下单失败", req.MerchantOrderId)
|
||||
return res, gerror.NewCode(gcode.CodeOperationFailed, "下单失败")
|
||||
}
|
||||
|
||||
glog.Info(ctx, "下单成功", "merchantOrderId", req.MerchantOrderId, "orderInfo", orderInfo)
|
||||
glog.Info(ctx, "下单成功", req.MerchantOrderId, orderInfo)
|
||||
|
||||
res = &v1.PlaceOrderRes{
|
||||
WxPay: orderInfo.JdOrder.WebPayLink,
|
||||
|
||||
@@ -9,11 +9,11 @@ import (
|
||||
"kami/utility/config"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
|
||||
"github.com/duke-git/lancet/v2/pointer"
|
||||
"github.com/gogf/gf/errors/gerror"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
)
|
||||
|
||||
|
||||
@@ -21,12 +21,13 @@ import (
|
||||
|
||||
// PlaceOrder 下单
|
||||
func (s *sCardRedeemCookie) PlaceOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, tx gdb.TX) (output *model.CardRedeemCookePlaceOrderOutput, err error) {
|
||||
gmlock.Lock("card_redeem_cookie_order_place_order_" + input.BankOrderId)
|
||||
defer gmlock.Unlock("card_redeem_cookie_order_place_order_" + input.BankOrderId)
|
||||
gmlock.Lock("card_redeem_cookie_order_place_order_" + input.OrderId)
|
||||
defer gmlock.Unlock("card_redeem_cookie_order_place_order_" + input.OrderId)
|
||||
output = &model.CardRedeemCookePlaceOrderOutput{}
|
||||
|
||||
orderInfo, _ := s.GetOrderByBankOrderId(ctx, input.BankOrderId, tx)
|
||||
orderInfo, _ := s.GetOrderByBankOrderId(ctx, input.OrderId, tx)
|
||||
if pointer.IsNil(orderInfo) || orderInfo.Id <= 0 {
|
||||
orderInfo, _ = s.placeNewOrder(ctx, input, nil)
|
||||
orderInfo, _ = s.placeNewOrder(ctx, input, input.Category, nil)
|
||||
}
|
||||
if consts.CardRedeemCookieOrderStatus(orderInfo.Status) == consts.CardRedeemCookieOrderStatusPlaceSuccess {
|
||||
output.V1CardRedeemCookieOrder = *orderInfo
|
||||
@@ -34,14 +35,14 @@ func (s *sCardRedeemCookie) PlaceOrder(ctx context.Context, input *model.CardRed
|
||||
output.JdOrder = *jdOrder
|
||||
return
|
||||
}
|
||||
orderInfo, _ = s.placeExistOrder(ctx, input.UserAgent, orderInfo, tx)
|
||||
orderInfo, _ = s.placeExistOrder(ctx, input.UserAgent, orderInfo, input.Category, tx)
|
||||
output.V1CardRedeemCookieOrder = *orderInfo
|
||||
return
|
||||
}
|
||||
|
||||
// 处理已有订单
|
||||
func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent string, input *entity.V1CardRedeemCookieOrder, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
|
||||
cookieInfo, jdOrder, err := s.placeJdOrder(ctx, input.OrderNo, userAgent, input.OrderAmount, tx)
|
||||
func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent string, input *entity.V1CardRedeemCookieOrder, category consts.RedeemOrderCardCategory, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
|
||||
cookieInfo, jdOrder, err := s.placeJdOrder(ctx, input.OrderNo, userAgent, input.OrderAmount, category, tx)
|
||||
|
||||
if pointer.IsNil(cookieInfo) {
|
||||
cookieInfo = &entity.V1CardRedeemCookieInfo{}
|
||||
@@ -76,20 +77,18 @@ func (s *sCardRedeemCookie) placeExistOrder(ctx context.Context, userAgent strin
|
||||
}
|
||||
|
||||
// 处理新订单
|
||||
func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
|
||||
func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.CardRedeemCookiePlaceOrderInput, category consts.RedeemOrderCardCategory, tx gdb.TX) (output *entity.V1CardRedeemCookieOrder, err error) {
|
||||
orderNo := utils.GenerateRandomUUID()
|
||||
|
||||
m := dao.V1CardRedeemCookieOrder.Ctx(ctx).DB(config.GetDatabaseV1())
|
||||
if tx != nil {
|
||||
m = m.TX(tx)
|
||||
}
|
||||
|
||||
err = m.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
|
||||
status := consts.CardRedeemCookieOrderStatusInit
|
||||
_, err = m.Ctx(ctx).TX(tx).Insert(do.V1CardRedeemCookieOrder{
|
||||
OrderNo: orderNo,
|
||||
Status: status,
|
||||
BankOrderId: input.BankOrderId,
|
||||
BankOrderId: input.OrderId,
|
||||
OrderAmount: input.OrderAmount,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -104,13 +103,13 @@ func (s *sCardRedeemCookie) placeNewOrder(ctx context.Context, input *model.Card
|
||||
|
||||
orderInfo := do.V1CardRedeemCookieOrder{}
|
||||
|
||||
accountInfo, jdOrder, err := s.placeJdOrder(ctx, orderNo, input.UserAgent, input.OrderAmount, tx)
|
||||
accountInfo, jdOrder, err := s.placeJdOrder(ctx, orderNo, input.UserAgent, input.OrderAmount, category, tx)
|
||||
if err != nil {
|
||||
orderInfo.Note = err.Error()
|
||||
glog.Error(ctx, "下单失败", err)
|
||||
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceFail
|
||||
} else if pointer.IsNil(jdOrder) || pointer.IsNil(accountInfo) {
|
||||
glog.Error(ctx, "下单失败,jdOrder", jdOrder)
|
||||
glog.Error(ctx, "下单失败", jdOrder)
|
||||
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceFail
|
||||
} else {
|
||||
orderInfo.Status = consts.CardRedeemCookieOrderStatusPlaceSuccess
|
||||
|
||||
@@ -2,7 +2,6 @@ package cardredeemcookie
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
v1 "kami/api/card_info_apple/v1"
|
||||
"kami/internal/consts"
|
||||
"kami/internal/dao"
|
||||
@@ -15,18 +14,18 @@ import (
|
||||
"kami/utility/utils"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
|
||||
"github.com/duke-git/lancet/v2/pointer"
|
||||
|
||||
"github.com/gogf/gf/errors/gerror"
|
||||
"github.com/gogf/gf/os/glog"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// 京东订单相关
|
||||
func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, userAgent string, orderAmount float64, tx gdb.TX) (accountInfo *entity.V1CardRedeemCookieInfo, output *originalJd.AppleRechargeResp, err error) {
|
||||
func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, userAgent string, orderAmount float64, category consts.RedeemOrderCardCategory, tx gdb.TX) (accountInfo *entity.V1CardRedeemCookieInfo, output *originalJd.AppleRechargeResp, err error) {
|
||||
accountInfo, err = s.ScheduleAccount(ctx, tx)
|
||||
if err != nil {
|
||||
return accountInfo, output, err
|
||||
@@ -61,16 +60,17 @@ func (s *sCardRedeemCookie) placeJdOrder(ctx context.Context, orderNo string, us
|
||||
_, _ = m.Insert(jdCookieInfo)
|
||||
}()
|
||||
|
||||
glog.Info(ctx, "开始下单", "cookie", accountInfo, "orderNo", orderNo, "orderAmount", orderAmount)
|
||||
glog.Info(ctx, "开始下单", accountInfo, orderNo, orderAmount, category)
|
||||
// 下单
|
||||
jdOrder, err := originalJd.NewClient().AppleRecharge(ctx, &originalJd.AppleRechargeReq{
|
||||
FacePrice: fmt.Sprintf("%f", orderAmount),
|
||||
FacePrice: orderAmount,
|
||||
OrderNum: orderNo,
|
||||
Category: category,
|
||||
UserClient: utils.GetClientTypeFromUserAgent(userAgent),
|
||||
Cookies: accountInfo.Cookie,
|
||||
})
|
||||
|
||||
glog.Info(ctx, "下单成功", "jdOrder", jdOrder)
|
||||
glog.Info(ctx, jdOrder)
|
||||
if pointer.IsNil(jdOrder) || jdOrder == nil {
|
||||
jdOrder = &originalJd.AppleRechargeResp{
|
||||
Code: consts.CardCookieJDStatusNormalFailed,
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"kami/utility/utils"
|
||||
|
||||
"github.com/duke-git/lancet/v2/slice"
|
||||
"github.com/gogf/gf/container/gset"
|
||||
"github.com/gogf/gf/v2/container/gset"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
|
||||
@@ -49,7 +49,8 @@ type CardRedeemCookieDeleteInput struct {
|
||||
}
|
||||
|
||||
type CardRedeemCookiePlaceOrderInput struct {
|
||||
BankOrderId string `json:"bankOrderId"`
|
||||
Category consts.RedeemOrderCardCategory
|
||||
OrderId string `json:"orderId"`
|
||||
OrderAmount float64 `json:"orderAmount"`
|
||||
UserAgent string `json:"userAgent"`
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ import (
|
||||
"fmt"
|
||||
"kami/utility/config"
|
||||
|
||||
"github.com/gogf/gf/util/gconv"
|
||||
"github.com/gogf/gf/v2/crypto/gmd5"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// GenerateCallbackSign 验证回调签名
|
||||
|
||||
@@ -3,41 +3,38 @@ package originalJd
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
)
|
||||
|
||||
// AppleRecharge 苹果权益充值——下单接口
|
||||
// AppleRecharge 所有权益充值——下单接口
|
||||
func (c *Client) AppleRecharge(ctx context.Context, input *AppleRechargeReq) (*AppleRechargeResp, error) {
|
||||
resp := &AppleRechargeResp{
|
||||
Status: false,
|
||||
}
|
||||
glog.Info(ctx, "苹果权益充值", "input", input)
|
||||
response, err := c.Client.ContentJson().Post(ctx, "http://jd_babel_channel:8289/jd/app/store", input)
|
||||
glog.Info(ctx, "苹果权益充值", input)
|
||||
response, err := c.Client.ContentJson().Post(ctx, "http://jd_babel_channel:8289/jd/app/placeOrder", input)
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
|
||||
clientResp := &AppleRechargeClientResp{}
|
||||
err = json.Unmarshal(response.ReadAll(), clientResp)
|
||||
glog.Info(ctx, "苹果权益充值", "clientResp", clientResp, response.ReadAllString())
|
||||
glog.Info(ctx, "苹果权益充值", response.ReadAllString())
|
||||
if err != nil {
|
||||
return resp, err
|
||||
}
|
||||
|
||||
resp.Msg = clientResp.Msg
|
||||
resp.Code = clientResp.Code.JDOrderStatus()
|
||||
if clientResp.Code != Success {
|
||||
return resp, errors.New("苹果权益充值失败")
|
||||
resp = &AppleRechargeResp{
|
||||
Status: true,
|
||||
Code: clientResp.Code.JDOrderStatus(),
|
||||
Deeplink: clientResp.Data.Deeplink,
|
||||
OrderId: clientResp.Data.OrderId,
|
||||
PayId: clientResp.Data.PayId,
|
||||
FacePrice: clientResp.Data.FacePrice,
|
||||
}
|
||||
if clientResp.Code != Success {
|
||||
return resp, gerror.New("苹果权益充值失败")
|
||||
}
|
||||
|
||||
resp.Status = true
|
||||
resp.Deeplink = clientResp.Data.Deeplink
|
||||
resp.OrderId = clientResp.Data.OrderId
|
||||
resp.PayId = clientResp.Data.PayId
|
||||
resp.FacePrice = clientResp.Data.FacePrice
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ func (c *Client) SmsLogin(ctx context.Context, input *SmsLoginReq) (*SmsLoginRes
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// 查询卡密
|
||||
// QueryCard 查询卡密
|
||||
func (c *Client) QueryCard(ctx context.Context, input *QueryCardReq) (*QueryCardResp, error) {
|
||||
resp := &QueryCardResp{}
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// 下单模型
|
||||
package originalJd
|
||||
|
||||
import "kami/internal/consts"
|
||||
@@ -45,10 +44,11 @@ type SmsLoginClientResp struct {
|
||||
}
|
||||
|
||||
type AppleRechargeReq struct {
|
||||
FacePrice string `json:"face_price"`
|
||||
OrderNum string `json:"order_num"`
|
||||
Cookies string `json:"cookies"`
|
||||
UserClient string `json:"user_client"`
|
||||
FacePrice float64 `json:"face_price"`
|
||||
Category consts.RedeemOrderCardCategory `json:"category"`
|
||||
OrderNum string `json:"order_num"`
|
||||
Cookies string `json:"cookies"`
|
||||
UserClient string `json:"user_client"`
|
||||
}
|
||||
|
||||
type AppleRechargeClientResp struct {
|
||||
|
||||
@@ -10,12 +10,12 @@ import (
|
||||
"kami/utility/utils"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/text/gstr"
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/gclient"
|
||||
"github.com/gogf/gf/v2/net/gtrace"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
@@ -14,11 +14,11 @@ import (
|
||||
|
||||
"github.com/duke-git/lancet/v2/pointer"
|
||||
"github.com/duke-git/lancet/v2/retry"
|
||||
"github.com/gogf/gf/text/gstr"
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/gclient"
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
|
||||
@@ -8,8 +8,7 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/util/grand"
|
||||
|
||||
"github.com/gogf/gf/v2/util/grand"
|
||||
"github.com/skip2/go-qrcode"
|
||||
"github.com/xlzd/gotp"
|
||||
)
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/text/gstr"
|
||||
"github.com/gogf/gf/v2/crypto/gmd5"
|
||||
"github.com/gogf/gf/v2/os/gmlock"
|
||||
"github.com/gogf/gf/v2/text/gstr"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func GenerateRandomUUID() string {
|
||||
gmlock.Lock("uuid")
|
||||
defer gmlock.Unlock("uuid")
|
||||
return gstr.Replace(uuid.NewString(), "-", "")
|
||||
uid, _ := uuid.NewV7()
|
||||
return gstr.Replace(uid.String(), "-", "")
|
||||
}
|
||||
|
||||
// TmpEncrypt 临时加密
|
||||
|
||||
Reference in New Issue
Block a user