diff --git a/platformapi/mtwmapi/order.go b/platformapi/mtwmapi/order.go index c52a554e..cafe4e57 100644 --- a/platformapi/mtwmapi/order.go +++ b/platformapi/mtwmapi/order.go @@ -147,3 +147,10 @@ func (a *API) OrderBatchPullPhoneNumber(poiCode string, offset, limit int) (real } return nil, err } + +func (a *API) OrderLogisticsChange2Self(orderID int64) (err error) { + _, err = a.AccessAPI("order/logistics/change/poi_self", true, map[string]interface{}{ + KeyOrderID: orderID, + }) + return err +} diff --git a/utils/typeconv.go b/utils/typeconv.go index 13f167cf..2136d3fc 100644 --- a/utils/typeconv.go +++ b/utils/typeconv.go @@ -3,6 +3,7 @@ package utils import ( "bytes" "encoding/json" + "errors" "fmt" "net/url" "reflect" @@ -69,12 +70,29 @@ func MustMarshal(obj interface{}) []byte { return byteArr } -func MustInterface2Int64(data interface{}) int64 { +func TryInterface2Int64(data interface{}) (num int64, err error) { + if data == nil { + return num, errors.New("data is nil") + } + if dataNumber, ok := data.(int64); ok { + return dataNumber, nil + } + if dataNumber, ok := data.(int); ok { + return int64(dataNumber), nil + } dataNumber, ok := data.(json.Number) if !ok { - panic(fmt.Sprintf("error when cast:%v to int64", data)) + return 0, fmt.Errorf("data is not json.Number:%v to int64", data) } retVal, err := dataNumber.Int64() + if err != nil { + return num, err + } + return retVal, nil +} + +func MustInterface2Int64(data interface{}) int64 { + retVal, err := TryInterface2Int64(data) if err != nil { panic(err.Error()) } @@ -82,10 +100,11 @@ func MustInterface2Int64(data interface{}) int64 { } func Interface2Int64WithDefault(data interface{}, defValue int64) int64 { - if data == nil { + retVal, err := TryInterface2Int64(data) + if err != nil { return defValue } - return MustInterface2Int64(data) + return retVal } func Interface2DirectIntWithDefault(data interface{}, defValue int) int { @@ -95,12 +114,29 @@ func Interface2DirectIntWithDefault(data interface{}, defValue int) int { return data.(int) } -func MustInterface2Float64(data interface{}) float64 { +func TryInterface2Float64(data interface{}) (num float64, err error) { + if data == nil { + return num, errors.New("data is nil") + } + if dataNumber, ok := data.(float64); ok { + return dataNumber, nil + } + if dataNumber, ok := data.(float32); ok { + return float64(dataNumber), nil + } dataNumber, ok := data.(json.Number) if !ok { - panic(fmt.Sprintf("error when convert:%v", data)) + return num, fmt.Errorf("data is not json.Number:%v", data) } retVal, err := dataNumber.Float64() + if err != nil { + return num, err + } + return retVal, nil +} + +func MustInterface2Float64(data interface{}) float64 { + retVal, err := TryInterface2Float64(data) if err != nil { panic(err.Error()) } @@ -108,10 +144,11 @@ func MustInterface2Float64(data interface{}) float64 { } func Interface2FloatWithDefault(data interface{}, defValue float64) (retVal float64) { - if _, ok := data.(json.Number); !ok { + retVal, err := TryInterface2Float64(data) + if err != nil { return defValue } - return MustInterface2Float64(data) + return retVal } func Interface2String(data interface{}) string { diff --git a/utils/typeconv_test.go b/utils/typeconv_test.go new file mode 100644 index 00000000..38548c7f --- /dev/null +++ b/utils/typeconv_test.go @@ -0,0 +1,32 @@ +package utils + +import ( + "encoding/json" + "testing" +) + +func TestConv(t *testing.T) { + for _, v := range [][]interface{}{ + []interface{}{ + json.Number("123"), + int64(123), + }, + []interface{}{ + json.Number("abc"), + int64(0), + }, + []interface{}{ + "123", + int64(0), + }, + []interface{}{ + int64(123), + int64(123), + }, + } { + data := Interface2Int64WithDefault(v[0], 0) + if data != v[1].(int64) { + t.Fatal("Interface2Int64WithDefault failed") + } + } +}