From d4c1b2fa77be1157d9567d14b28da24c1b0b7ed4 Mon Sep 17 00:00:00 2001 From: houseme Date: Thu, 15 Jun 2023 17:00:43 +0800 Subject: [PATCH] feat: create func (#14) * feat: create recharge and create merchant relation and create,modify,query store * feat: improve workflows config * feat: improve code workflows config * feat: create func --- constant.go | 147 +++++++++++++- domain/orders.go | 31 ++- go.mod | 16 +- go.sum | 17 ++ imdada.go | 354 +++++++++++++++++++++++++++++++++- log.go => internal/log/log.go | 21 +- metada.go | 38 ---- 7 files changed, 549 insertions(+), 75 deletions(-) rename log.go => internal/log/log.go (87%) delete mode 100644 metada.go diff --git a/constant.go b/constant.go index 8d53e99..e5b2ec9 100644 --- a/constant.go +++ b/constant.go @@ -99,14 +99,17 @@ const ( // complaintCreate 创建投诉 complaintCreate = "/api/complaint/dada" + // ComplaintReasons 投诉原因列表 + complaintReasons = "/api/complaint/reasons" + // orderConfirmGoods 商户确认物品已返还 orderConfirmGoods = "/api/order/confirm/goods" // messageConfirm 商户确认消息已读 messageConfirm = "/api/message/confirm" - // transporterPositionList 骑手列表 - transporterPositionList = "/api/order/transporter/position" + // transporterPosition 查询骑士位置 + transporterPosition = "/api/order/transporter/position" // transporterTrack 骑手轨迹 transporterTrack = "/api/order/transporter/track" @@ -150,3 +153,143 @@ const ( campus = 65 // 校园 highEndMarket = 66 // 高端市场 ) + +// RechargeCateH5 H5充值 +func RechargeCateH5() string { + return rechargeCateH5 +} + +// RechargeCatePC PC充值 +func RechargeCatePC() string { + return rechargeCatePC +} + +// FoodSnacks 食品小吃 +func FoodSnacks() int { + return foodSnacks +} + +// Drink 饮料 +func Drink() int { + return drink +} + +// FlowersAndGreenery 鲜花绿植 +func FlowersAndGreenery() int { + return flowersAndGreenery +} + +// Other 其他 +func Other() int { + return other +} + +// PrintingTicketing 文印票务 +func PrintingTicketing() int { + return printingTicketing +} + +// ConvenienceStores 便利店 +func ConvenienceStores() int { + return convenienceStores +} + +// FreshFruit 水果生鲜 +func FreshFruit() int { + return freshFruit +} + +// IntraCityECommerce 同城电商 +func IntraCityECommerce() int { + return intraCityECommerce +} + +// Medicine 医药 +func Medicine() int { + return medicine +} + +// Cake 蛋糕 +func Cake() int { + return cake +} + +// Wine 酒品 +func Wine() int { + return wine +} + +// SmallCommodityMarkets 小商品市场 +func SmallCommodityMarkets() int { + return smallCommodityMarkets +} + +// Clothing 服装 +func Clothing() int { + return clothing +} + +// AutoRepairParts 汽修零配 +func AutoRepairParts() int { + return autoRepairParts +} + +// DigitalAppliances 数码家电 +func DigitalAppliances() int { + return digitalAppliances +} + +// CrayfishBBQ 小龙虾/烧烤 +func CrayfishBBQ() int { + return crayfishBBQ +} + +// Supermarket 超市 +func Supermarket() int { + return supermarket +} + +// ChafingDish 火锅 +func ChafingDish() int { + return chafingDish +} + +// PersonalCareMakeup 个护美妆 +func PersonalCareMakeup() int { + return personalCareMakeup +} + +// Mother 母婴 +func Mother() int { + return mother +} + +// HomeTextiles 家居家纺 +func HomeTextiles() int { + return homeTextiles +} + +// CellPhone 手机 +func CellPhone() int { + return cellPhone +} + +// Home 家装 +func Home() int { + return home +} + +// AdultProducts 成人用品 +func AdultProducts() int { + return adultProducts +} + +// Campus 校园 +func Campus() int { + return campus +} + +// HighEndMarket 高端市场 +func HighEndMarket() int { + return highEndMarket +} diff --git a/domain/orders.go b/domain/orders.go index 50d8ebe..d8778e8 100644 --- a/domain/orders.go +++ b/domain/orders.go @@ -55,21 +55,21 @@ type OrdersCreateRequest struct { // ProductItem is the item of product_list. type ProductItem struct { - Count float64 `json:"count"` - SkuName string `json:"sku_name"` - SrcProductNo string `json:"src_product_no"` - Unit string `json:"unit"` + Count float64 `json:"count"` // 商品数量,精确到小数点后两位 + SkuName string `json:"sku_name"` // 商品名称,限制长度128 + SrcProductNo string `json:"src_product_no"` // 商品编码,限制长度64 + Unit string `json:"unit"` // 商品单位,默认:件 } // OrdersCreateResponse is the response of orders/create. type OrdersCreateResponse struct { - Status string `json:"status"` - Result *OrdersCreateResult `json:"result"` - Code int `json:"code"` - Msg string `json:"msg"` + Status string `json:"status"` // 响应状态,成功为"success",失败为"fail" + Result *OrdersCreateResult `json:"result"` // 响应结果,JSON对象,详见具体的接口描述 + Code int `json:"code"` // 响应返回码,参考接口返回码 + Msg string `json:"msg"` // 响应描述 Success bool `json:"success"` Fail bool `json:"fail"` - ErrorCode int `json:"errorCode"` + ErrorCode int `json:"errorCode"` // 错误编码,与code一致 } // OrdersCreateResult is the result of orders/create. @@ -429,8 +429,19 @@ type MessageBodyConfirm struct { RejectReason string `json:"rejectReason,omitempty"` // 拒绝原因 } +// OrdersTransporterCancelAsyncConfirmResponse is the response of orders/transporterCancel. +type OrdersTransporterCancelAsyncConfirmResponse struct { + Status string `json:"status"` + Result interface{} `json:"result"` + Code int `json:"code"` + Msg string `json:"msg"` + Success bool `json:"success"` + Fail bool `json:"fail"` + ErrorCode int `json:"errorCode"` +} + // OrdersTransporterPositionRequest is the request of orders/transporterPosition. -// See: http://newopen.imdada.cn/#/development/file/queryLocation +// See: http://newopen.imdada.cn/#/development/file/queryLocation 查询骑士位置 // 接口调用URL地址:/api/order/transporter/position type OrdersTransporterPositionRequest struct { OrderIDS []string `json:"orderIds"` // 达达订单号 第三方订单号列表,最多传50个 diff --git a/go.mod b/go.mod index 7946639..350e9fd 100644 --- a/go.mod +++ b/go.mod @@ -14,23 +14,23 @@ require ( github.com/BurntSushi/toml v1.2.1 // indirect github.com/andeya/ameda v1.5.3 // indirect github.com/andeya/goutil v1.0.1 // indirect - github.com/bytedance/go-tagexpr/v2 v2.9.7 // indirect - github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9 // indirect + github.com/bytedance/go-tagexpr/v2 v2.9.8 // indirect + github.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/cloudwego/netpoll v0.3.2 // indirect + github.com/cloudwego/netpoll v0.4.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/nyaruka/phonenumbers v1.1.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/nyaruka/phonenumbers v1.1.7 // indirect github.com/tidwall/gjson v1.14.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - go.uber.org/atomic v1.10.0 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.9.0 // indirect + golang.org/x/text v0.10.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect ) diff --git a/go.sum b/go.sum index 547d164..ed8f18c 100644 --- a/go.sum +++ b/go.sum @@ -9,9 +9,13 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/bytedance/go-tagexpr/v2 v2.9.2/go.mod h1:5qsx05dYOiUXOUgnQ7w3Oz8BYs2qtM/bJokdLb79wRM= github.com/bytedance/go-tagexpr/v2 v2.9.7 h1:y1b2Qv1fYFNpFEQ1jC3DCB2NZZNrKIpUYRiEj7TfUYE= github.com/bytedance/go-tagexpr/v2 v2.9.7/go.mod h1:SyfF2dfcKGKIfTL2trRu+LW4x2mH6ehuigpkvv9JtpY= +github.com/bytedance/go-tagexpr/v2 v2.9.8 h1:p1PWxiUPxAdzreRBRbC9M2k7tf1cZYkds58NLypXbg4= +github.com/bytedance/go-tagexpr/v2 v2.9.8/go.mod h1:UAyKh4ZRLBPGsyTRFZoPqTni1TlojMdOJXQnEIPCX84= github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7/go.mod h1:2ZlV9BaUH4+NXIBF0aMdKKAnHTzqH+iMU4KUjAbL23Q= github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9 h1:YTSJ7dHOZHZJxCwj4WuLPAwKGIbWs2fiMY2CatwDToQ= github.com/bytedance/gopkg v0.0.0-20230324090325-a00d8057bef9/go.mod h1:5tCTcGDVBC/YUpwmVUI14jYgkemT1CAeUyQe0J5DLUs= +github.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317 h1:SReMVmTCeJ5Nf0hU8nyWu7gAaFVD8mu5yvSH/+uLT1E= +github.com/bytedance/gopkg v0.0.0-20230531144706-a12972768317/go.mod h1:FtQG3YbQG9L/91pbKSw787yBQPutC+457AvDW77fgUQ= github.com/bytedance/mockey v1.2.1 h1:g84ngI88hz1DR4wZTL3yOuqlEcq67MretBfQUdXwrmw= github.com/bytedance/mockey v1.2.1/go.mod h1:+Jm/fzWZAuhEDrPXVjDf/jLM2BlLXJkwk94zf2JZ3X4= github.com/bytedance/sonic v1.3.5/go.mod h1:V973WhNhGmvHxW6nQmsHEfHaoU9F3zTF+93rH03hcUQ= @@ -28,6 +32,8 @@ github.com/cloudwego/hertz v0.6.4/go.mod h1:KhztQcZtMQ46gOjZcmCy557AKD29cbumGEV0 github.com/cloudwego/netpoll v0.2.6/go.mod h1:1T2WVuQ+MQw6h6DpE45MohSvDTKdy2DlzCx2KsnPI4E= github.com/cloudwego/netpoll v0.3.2 h1:/998ICrNMVBo4mlul4j7qcIeY7QnEfuCCPPwck9S3X4= github.com/cloudwego/netpoll v0.3.2/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= +github.com/cloudwego/netpoll v0.4.0 h1:kJ2jMsT5FtlGSNtInnprJf386TFE/rGWzl8kp0wWxx4= +github.com/cloudwego/netpoll v0.4.0/go.mod h1:xVefXptcyheopwNDZjDPcfU6kIjZXZ4nY550k1yH9eQ= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -55,6 +61,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV 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/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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= @@ -65,6 +73,8 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf github.com/nyaruka/phonenumbers v1.0.55/go.mod h1:sDaTZ/KPX5f8qyV9qN+hIm+4ZBARJrupC6LuhshJq1U= github.com/nyaruka/phonenumbers v1.1.6 h1:DcueYq7QrOArAprAYNoQfDgp0KetO4LqtnBtQC6Wyes= github.com/nyaruka/phonenumbers v1.1.6/go.mod h1:yShPJHDSH3aTKzCbXyVxNpbl2kA+F+Ne5Pun/MvFRos= +github.com/nyaruka/phonenumbers v1.1.7 h1:5UUI9hE79Kk0dymSquXbMYB7IlNDNhvu2aNlJpm9et8= +github.com/nyaruka/phonenumbers v1.1.7/go.mod h1:DC7jZd321FqUe+qWSNcHi10tyIyGNXGcNbfkPvdp1Vs= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -102,6 +112,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +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.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -137,8 +149,11 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -146,6 +161,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= diff --git a/imdada.go b/imdada.go index c607107..5f8a338 100644 --- a/imdada.go +++ b/imdada.go @@ -24,7 +24,9 @@ import ( "crypto/md5" "crypto/tls" "encoding/hex" + "errors" "os" + "sort" "strconv" "strings" "time" @@ -36,6 +38,7 @@ import ( "github.com/cloudwego/hertz/pkg/protocol/consts" "github.com/houseme/imdada-go/domain" + "github.com/houseme/imdada-go/internal/log" ) // options is the configuration for the ImDada client. @@ -158,7 +161,7 @@ func New(ctx context.Context, opts ...Option) *Client { c := &Client{ op: op, - log: nil, + log: log.InitLog(ctx, op.LogPath, op.Level), response: &protocol.Response{}, request: &domain.Request{ AppKey: op.AppKey, @@ -167,7 +170,8 @@ func New(ctx context.Context, opts ...Option) *Client { SourceID: op.SourceID, }, } - c.initLog(ctx, op) + c.log.SetLevel(op.Level) + c.log.CtxInfof(ctx, "im dada init client start level:%s", op.Level) return c } @@ -178,10 +182,7 @@ func (c *Client) generateTimestamp() { // md5Sign func (c *Client) md5Sign() { - var ( - h = md5.New() - builder strings.Builder - ) + var builder strings.Builder builder.WriteString(c.op.AppSecret) builder.WriteString("app_key" + c.request.AppKey) builder.WriteString("body" + c.request.Body) @@ -190,6 +191,7 @@ func (c *Client) md5Sign() { builder.WriteString("timestamp" + strconv.FormatInt(c.request.Timestamp, 10)) builder.WriteString("v" + c.request.V) builder.WriteString(c.op.AppSecret) + h := md5.New() h.Write([]byte(builder.String())) c.request.Signature = strings.ToUpper(hex.EncodeToString(h.Sum(nil))) } @@ -336,3 +338,343 @@ func (c *Client) QueryShop(ctx context.Context, req *domain.ShopQueryRequest) (r } return } + +// QueryCity query city list +// 获取城市信息列表 http://newopen.imdada.cn/#/development/file/cityList +func (c *Client) QueryCity(ctx context.Context, req *domain.CityListQueryRequest) (resp *domain.CityListQueryResponse, err error) { + if req == nil { + c.request.Body = "" + } else { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + } + c.log.CtxDebugf(ctx, "QueryCity request data: %s ", c.request.Body) + if err = c.doRequest(ctx, cityCodeList); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryCity response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// CreateOrder create order. +// 添加订单 url: http://newopen.imdada.cn/#/development/file/add +func (c *Client) CreateOrder(ctx context.Context, req *domain.OrdersCreateRequest) (resp *domain.OrdersCreateResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CreateOrder request data: %s", c.request.Body) + if err = c.doRequest(ctx, ordersCreate); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CreateOrder response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// ReCreateOrder recreate order. +// 重新发布订单 url: http://newopen.imdada.cn/#/development/file/reAdd +func (c *Client) ReCreateOrder(ctx context.Context, req *domain.OrdersCreateRequest) (resp *domain.OrdersCreateResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "ReCreateOrder request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderReCreate); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "ReCreateOrder response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// QueryDeliverFee query deliver fee. +// 订单运费查询 url: http://newopen.imdada.cn/#/development/file/readyAdd +func (c *Client) QueryDeliverFee(ctx context.Context, req *domain.DeliverFeeQueryRequest) (resp *domain.DeliverFeeQueryResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryDeliverFee request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderDeliverFeeQuery); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryDeliverFee response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// OrdersCreateByDeliverFeeQuery create order by deliver the fee query. +// 通过运费接口创建订单 url: http://newopen.imdada.cn/#/development/file/addAfterQuery +func (c *Client) OrdersCreateByDeliverFeeQuery(ctx context.Context, req *domain.OrdersCreateByDeliverFeeQueryRequest) (resp *domain.OrdersCreateByDeliverFeeQueryResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrdersCreateByDeliverFeeQuery request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderCreateAfterQuery); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrdersCreateByDeliverFeeQuery response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// OrdersAddTip add tip. +// 添加小费 url: http://newopen.imdada.cn/#/development/file/addTip +func (c *Client) OrdersAddTip(ctx context.Context, req *domain.OrdersAddTipRequest) (resp *domain.OrdersAddTipResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrdersAddTip request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderAddTip); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrdersAddTip response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// QueryOrderStatus query order status. +// 订单详情查询 url: http://newopen.imdada.cn/#/development/file/statusQuery +func (c *Client) QueryOrderStatus(ctx context.Context, req *domain.OrdersQueryRequest) (resp *domain.OrdersQueryResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryOrderStatus request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderStatusQuery); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryOrderStatus response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// CancelOrder cancel order. +// 取消订单 url: http://newopen.imdada.cn/#/development/file/formalCancel +func (c *Client) CancelOrder(ctx context.Context, req *domain.OrdersCancelRequest) (resp *domain.OrdersCancelResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CancelOrder request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderCancel); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CancelOrder response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// AdditionalOrders additional order. +// 增加订单 url: http://newopen.imdada.cn/#/development/file/appointOrder +func (c *Client) AdditionalOrders(ctx context.Context, req *domain.OrdersAddAppointRequest) (resp *domain.OrdersAddAppointResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "AdditionalOrders request data: %s", c.request.Body) + if err = c.doRequest(ctx, additionalOrders); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "AdditionalOrders response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// CancelTheAddOnOrder cancel appoint order CancelTheAddOnOrder +// 取消预约单 url: http://newopen.imdada.cn/#/development/file/appointOrderCancel +func (c *Client) CancelTheAddOnOrder(ctx context.Context, req *domain.OrdersCancelAppointRequest) (resp *domain.OrdersCancelAppointResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CancelTheAddOnOrder request data: %s", c.request.Body) + if err = c.doRequest(ctx, cancelAppointOrders); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CancelTheAddOnOrder response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// QueriesCanAppendKnights query can append knights. +// 查询可追加骑士 url: http://newopen.imdada.cn/#/development/file/listTransportersToAppoint +func (c *Client) QueriesCanAppendKnights(ctx context.Context, req *domain.OrdersAppointTransporterRequest) (resp *domain.OrdersAppointTransporterResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueriesCanAppendKnights request data: %s", c.request.Body) + if err = c.doRequest(ctx, transportAppointList); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueriesCanAppendKnights response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// CreateAComplaint create a complaint. +// 创建投诉 url: http://newopen.imdada.cn/#/development/file/complaintDada +func (c *Client) CreateAComplaint(ctx context.Context, req *domain.ComplaintRequest) (resp *domain.ComplaintResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CreateAComplaint request data: %s", c.request.Body) + if err = c.doRequest(ctx, complaintCreate); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "CreateAComplaint response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// QueryComplaint query complaint. +// 查询投诉 url: http://newopen.imdada.cn/#/development/file/queryComplaintDada +func (c *Client) QueryComplaint(ctx context.Context, req *domain.ComplaintReasonRequest) (resp *domain.ComplaintReasonResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryComplaint request data: %s", c.request.Body) + if err = c.doRequest(ctx, complaintReasons); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryComplaint response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + + return +} + +// OrderConfirmGoods order confirm goods. +// 商户确认物品已返还 +func (c *Client) OrderConfirmGoods(ctx context.Context, req *domain.OrdersConfirmGoodsRequest) (resp *domain.OrdersConfirmGoodsResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrderConfirmGoods request data: %s", c.request.Body) + if err = c.doRequest(ctx, orderConfirmGoods); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrderConfirmGoods response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// OrderConfirmCancel order confirm cancel. +// 商户审核骑士取消订单 url: http://newopen.imdada.cn/#/development/file/applicationCancel +func (c *Client) OrderConfirmCancel(ctx context.Context, req *domain.OrdersTransporterCancelAsyncConfirmRequest) (resp *domain.OrdersTransporterCancelAsyncConfirmResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrderConfirmCancel request data: %s", c.request.Body) + if err = c.doRequest(ctx, messageConfirm); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "OrderConfirmCancel response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// QueryTransporterPosition query transporter position. +// 查询骑士位置 url: http://newopen.imdada.cn/#/development/file/queryLocation +func (c *Client) QueryTransporterPosition(ctx context.Context, req *domain.OrdersTransporterPositionRequest) (resp *domain.OrdersTransporterPositionResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryTransporterPosition request data: %s", c.request.Body) + if err = c.doRequest(ctx, transporterPosition); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryTransporterPosition response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// QueryTransporterTrack query transporter track. +// 查询骑士轨迹 url: http://newopen.imdada.cn/#/development/file/queryDeliverTrack +func (c *Client) QueryTransporterTrack(ctx context.Context, req *domain.OrdersTransporterTrackRequest) (resp *domain.OrdersTransporterTrackResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryTransporterTrack request data: %s", c.request.Body) + if err = c.doRequest(ctx, transporterTrack); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "QueryTransporterTrack response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// ModifyFetchCode modify fetch code. +// 修改取货码 url: http://newopen.imdada.cn/#/development/file/modifyFetchCode +func (c *Client) ModifyFetchCode(ctx context.Context, req *domain.OrdersFetchCodeModifyRequest) (resp *domain.OrdersFetchCodeModifyResponse, err error) { + if c.request.Body, err = sonic.MarshalString(req); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "ModifyFetchCode request data: %s", c.request.Body) + if err = c.doRequest(ctx, fetchCodeModify); err != nil { + return nil, err + } + c.log.CtxDebugf(ctx, "ModifyFetchCode response data: %s", string(c.response.Body())) + if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { + return nil, err + } + return +} + +// + +// VerifySignature verify signature. +func (c *Client) VerifySignature(_ context.Context, updateTime int64, clientID, orderID, signature string) (err error) { + var list []string + list = append(list, strconv.FormatInt(updateTime, 10)) + list = append(list, clientID) + list = append(list, orderID) + sort.Strings(list) + sign := strings.Join(list, "") + h := md5.New() + h.Write([]byte(sign)) + if hex.EncodeToString(h.Sum(nil)) != signature { + return errors.New("signature error") + } + return +} diff --git a/log.go b/internal/log/log.go similarity index 87% rename from log.go rename to internal/log/log.go index 8f69bb4..557d7f1 100644 --- a/log.go +++ b/internal/log/log.go @@ -16,7 +16,7 @@ * You can obtain one at https://github.com/houseme/imdada-go. */ -package dada +package log import ( "context" @@ -29,7 +29,8 @@ import ( "go.uber.org/zap/zapcore" ) -func (c *Client) initLog(ctx context.Context, op options) { +// InitLog init log +func InitLog(ctx context.Context, path string, level hlog.Level) hlog.FullLogger { dynamicLevel := zap.NewAtomicLevel() dynamicLevel.SetLevel(zap.DebugLevel) logger := hertzzap.NewLogger( @@ -41,12 +42,12 @@ func (c *Client) initLog(ctx context.Context, op options) { }, { Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), - Ws: getWriteSyncer(op.LogPath + "/all.log"), + Ws: getWriteSyncer(path + "/all.log"), Lvl: zap.NewAtomicLevelAt(zapcore.DebugLevel), }, { Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), - Ws: getWriteSyncer(op.LogPath + "/debug.log"), + Ws: getWriteSyncer(path + "/debug.log"), Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev == zap.DebugLevel @@ -54,7 +55,7 @@ func (c *Client) initLog(ctx context.Context, op options) { }, { Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), - Ws: getWriteSyncer(op.LogPath + "/info.log"), + Ws: getWriteSyncer(path + "/info.log"), Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev == zap.InfoLevel @@ -62,7 +63,7 @@ func (c *Client) initLog(ctx context.Context, op options) { }, { Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), - Ws: getWriteSyncer(op.LogPath + "/warn.log"), + Ws: getWriteSyncer(path + "/warn.log"), Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev == zap.WarnLevel @@ -70,7 +71,7 @@ func (c *Client) initLog(ctx context.Context, op options) { }, { Enc: zapcore.NewJSONEncoder(humanEncoderConfig()), - Ws: getWriteSyncer(op.LogPath + "/error.log"), + Ws: getWriteSyncer(path + "/error.log"), Lvl: zap.NewAtomicLevelAt(zapcore.LevelOf( zap.LevelEnablerFunc(func(lev zapcore.Level) bool { return lev >= zap.ErrorLevel @@ -80,10 +81,8 @@ func (c *Client) initLog(ctx context.Context, op options) { ) defer logger.Sync() hlog.SetLogger(logger) - hlog.SetLevel(op.Level) - c.log = logger - c.log.SetLevel(op.Level) - c.log.CtxInfof(ctx, "im dada init log start level:%s", op.Level) + hlog.SetLevel(level) + return logger } // humanEncoderConfig copy from zap diff --git a/metada.go b/metada.go deleted file mode 100644 index 80c1a0e..0000000 --- a/metada.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright ImDaDa-Go Author(https://houseme.github.io/imdada-go/). All Rights Reserved. - * - * This Source Code Form is subject to the terms of the Apache-2.0 License. - * If a copy of the MIT was not distributed with this file, - * You can obtain one at https://github.com/houseme/imdada-go. - */ - -package dada - -import ( - "context" - - "github.com/bytedance/sonic" - - "github.com/houseme/imdada-go/domain" -) - -// QueryCity query city list -// 获取城市信息列表 http://newopen.imdada.cn/#/development/file/cityList -func (c *Client) QueryCity(ctx context.Context, req *domain.CityListQueryRequest) (resp *domain.CityListQueryResponse, err error) { - if req == nil { - c.request.Body = "" - } else { - if c.request.Body, err = sonic.MarshalString(req); err != nil { - return nil, err - } - } - c.log.CtxDebugf(ctx, "QueryCity request data: %s ", c.request.Body) - if err = c.doRequest(ctx, cityCodeList); err != nil { - return nil, err - } - c.log.CtxDebugf(ctx, "QueryCity response data: %s", string(c.response.Body())) - if err = sonic.Unmarshal(c.response.Body(), &resp); err != nil { - return nil, err - } - return -}