京东JavaDate类型,改为毫秒的timestamp类型兼容处理。

This commit is contained in:
gazebo
2019-11-15 15:18:29 +08:00
parent 74d40eb1fd
commit 57d00d1bc7
12 changed files with 161 additions and 32 deletions

View File

@@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"net/http"
"reflect"
"sort"
"strings"
@@ -411,3 +412,25 @@ func getErrMsgFromData(data map[string]interface{}) string {
}
return msg
}
func JavaDateHook(fromType reflect.Type, toType reflect.Type, data interface{}) (interface{}, error) {
if (fromType.Kind() >= reflect.Int && fromType.Kind() <= reflect.Uint64) ||
fromType.Kind() == reflect.String {
if toType.Kind() == reflect.Ptr {
toType = toType.Elem()
}
if toType.Kind() == reflect.Struct &&
toType.Name() == "JavaDate" {
if sec := utils.Interface2Int64WithDefault(data, 0); sec > 0 {
data = utils.NewJavaDateFromTime(utils.Timestamp2Time(sec))
} else if fromType.Kind() == reflect.String {
data = utils.NewJavaDateFromTime(utils.Str2Time(data.(string)))
}
}
}
return data, nil
}
func JdMap2StructByJson(inObj interface{}, outObjAddr interface{}, weaklyTypedInput bool) (err error) {
return utils.Map2Struct(inObj, outObjAddr, true, "", JavaDateHook)
}

View File

@@ -101,3 +101,98 @@ func TestGenerateURL(t *testing.T) {
}
defer response.Body.Close()
}
func TestJdMap2StructByJson(t *testing.T) {
testStr := `
{
"stationNo": "11053496",
"stationName": "京西菜市-三平台测试门店4",
"outSystemId": "2",
"mobile": "18109051396",
"phone": "13684045765",
"lat": 34.224367,
"lng": 108.726791,
"city": 2376,
"county": 50231,
"stationAddress": "西安市长安区长安区",
"serviceTimeEnd1": 47,
"serviceTimeStart1": 1,
"closeStatus": 1,
"allowRangeOptimized": 0,
"cacheKey4StoreList": "_sn_11053496vi_82029p_2376c_2376co_50231oi_2wt_2sne_京西菜市-三平台测试门店4sa_西安市长安区长安区yn_0pe_2",
"carrierNo": 9966,
"cityName": "西安市",
"coordinate": "108.726791,34.224367",
"coordinateAddress": "韩南村",
"countyName": "长安区",
"createPin": "jd_jxcs8285",
"createTime": {
"day": 4,
"hours": 13,
"minutes": 33,
"seconds": 22,
"time": 1470893602321,
"timezoneOffset": -480,
"date": 11,
"month": 7,
"year": 116
},
"id": 123108,
"industryTag": 3,
"innerNoStatus": 1,
"isAutoOrder": 0,
"isMembership": 0,
"isNoPaper": 2,
"onlineTime": 1470893602123,
"orderAging": 60,
"orderNoticeType": 1,
"preWarehouse": 2,
"province": 2376,
"provinceName": "西安市",
"qualifyStatus": 2,
"regularFlag": 3,
"stationDeliveryStatus": 2,
"supportInvoice": 0,
"supportOfflinePurchase": 0,
"testMark": 0,
"timeAmType": 1,
"timePmType": 0,
"ts": {
"day": 2,
"hours": 16,
"minutes": 22,
"seconds": 13,
"time": 1571127733000,
"timezoneOffset": -480,
"date": 15,
"month": 9,
"year": 119
},
"updatePin": "jxadmin-zhouyang",
"updateTime": 1571127733,
"venderId": "82029",
"venderName": "测试京西菜市",
"wareType": 2,
"whiteDelivery": false,
"yn": 0
}
`
var rawData interface{}
err := utils.UnmarshalUseNumber([]byte(testStr), &rawData)
if err != nil {
t.Fatal(err)
}
var store *StoreDetail
err = JdMap2StructByJson(rawData, &store, true)
if err != nil {
t.Fatal(err)
}
if store.CreateTime.GoTime().Unix() != 1470893602 ||
store.OnlineTime.GoTime().Unix() != 1470893602 ||
store.UpdateTime.GoTime().Unix() != 1571127733 {
t.Fatalf("%d,%d,%d", store.CreateTime.GoTime().Unix(), store.OnlineTime.GoTime().Unix(), store.UpdateTime.GoTime().Unix())
}
t.Log(utils.Format4Output(store, false))
t.Log(store.CreateTime)
}

View File

@@ -399,7 +399,7 @@ func (a *API) QuerySingleOrder(orderId string) (map[string]interface{}, error) {
func (a *API) OrderQuery2(queryParam *OrderQueryParam) (retVal []*OrderInfo, totalCount int, err error) {
orderList, totalCount, err := a.OrderQuery(utils.Struct2MapByJson(queryParam))
if err == nil {
err = utils.Map2StructByJson(orderList, &retVal, true)
err = JdMap2StructByJson(orderList, &retVal, true)
}
return retVal, totalCount, err
}
@@ -506,7 +506,7 @@ func (a *API) OrderShoudSettlementService(orderId string) (map[string]interface{
func (a *API) OrderShoudSettlementService2(orderId string) (orderSettlement *OrderSettlementInfo, err error) {
result, err := a.OrderShoudSettlementService(orderId)
if err == nil {
err = utils.Map2StructByJson(result, &orderSettlement, false)
err = JdMap2StructByJson(result, &orderSettlement, false)
}
return orderSettlement, err
}
@@ -527,7 +527,7 @@ func (a *API) GetAfsService(orderId string) (map[string]interface{}, error) {
func (a *API) GetAfsService2(afsOrderID string) (afsOrderInfo *AfsServiceResponse, err error) {
result, err := a.GetAfsService(afsOrderID)
if err == nil {
if err = utils.Map2StructByJson(result, &afsOrderInfo, false); err != nil {
if err = JdMap2StructByJson(result, &afsOrderInfo, false); err != nil {
baseapi.SugarLogger.Warnf("GetAfsService2, result:%s failed with error:%v", utils.Format4Output(result, true), err)
}
}
@@ -703,7 +703,7 @@ func (a *API) GetByOrderNoForOaos(orderNo string) (orderTrackList []*OrderTrack,
}
result, err := a.AccessAPINoPage("orderTrace/getByOrderNoForOaos", jdParams, nil, nil, genNoPageResultParser("code", "msg", "orderTrackList", "0"))
if err == nil {
err = utils.Map2StructByJson(result, &orderTrackList, false)
err = JdMap2StructByJson(result, &orderTrackList, false)
}
return orderTrackList, err
}
@@ -716,7 +716,7 @@ func (a *API) GetByOrderNoForOaosNew(orderID string) (orderTrackList []*OrderTra
}
result, err := a.AccessAPINoPage("orderTrace/getByOrderNoForOaosNew", jdParams, nil, nil, genNoPageResultParser("code", "detail", "result", "0"))
if err == nil {
err = utils.Map2StructByJson(result.(map[string]interface{})["orderTrackList"], &orderTrackList, false)
err = JdMap2StructByJson(result.(map[string]interface{})["orderTrackList"], &orderTrackList, false)
}
return orderTrackList, err
}

View File

@@ -89,7 +89,7 @@ func (a *API) OrderDiscountQueryActivityInfoById(activityID int64, promotionType
}
result, err := a.AccessAPINoPage("orderdiscount/queryActivityInfoById", params, nil, nil, genNoPageResultParser("errorCode", "errorInfos", "data", "10000"))
if err == nil {
err = utils.Map2StructByJson(result, &response, false)
err = JdMap2StructByJson(result, &response, false)
}
return response, err
}
@@ -102,7 +102,7 @@ func (a *API) QueryPromotionInfo(promotionInfoId int64) (promotionInfo *Promotio
}
result, err := a.AccessAPINoPage("singlePromote/queryPromotionInfo", jdParams, nil, nil, genNoPageResultParser("errorCode", "errorInfos", "data", "0"))
if err == nil {
err = utils.Map2StructByJson(result, &promotionInfo, false)
err = JdMap2StructByJson(result, &promotionInfo, false)
}
return promotionInfo, err
}
@@ -117,7 +117,7 @@ func (a *API) QueryPromotionSku(promotionType int, skuID int64, promotionState i
}
result, _, err := a.AccessAPIHavePage("singlePromote/queryPromotionSku", jdParams, nil, nil, genNormalHavePageResultParser("data"))
if err != nil {
err = utils.Map2StructByJson(result, &skuResultList, false)
err = JdMap2StructByJson(result, &skuResultList, false)
}
return skuResultList, err
}

View File

@@ -125,7 +125,7 @@ func (a *API) OrderDiscountQuerySubmitActivityResult(activityID int64) (response
"traceId": utils.GetUUID(),
}, nil, nil, genNoPageResultParser("code", "detail", "result", "0"))
if err == nil {
err = utils.Map2StructByJson(result.([]interface{})[0], &response, true) // todo只取第一个
err = JdMap2StructByJson(result.([]interface{})[0], &response, true) // todo只取第一个
}
return response, err
}
@@ -141,7 +141,7 @@ func (a *API) OrderDiscountQueryActivityInfo(activityID int64) (response *Activi
"version": "",
}, nil, nil, genNoPageResultParser("code", "detail", "result", "0"))
if err == nil {
err = utils.Map2StructByJson(result, &response, true)
err = JdMap2StructByJson(result, &response, true)
}
return response, err
}

View File

@@ -191,7 +191,7 @@ func (a *API) createPromotionSku(promotionType int, infoId int64, outInfoId stri
// todo 当前是在出错时把data中的数据当成错误信息处理的
result, err := a.AccessAPINoPage(getPromotionCmd("createPromotionSku", promotionType), jdParams, nil, nil, genNoPageResultParser("errorCode", "data", "", "0"))
if err == nil && result != nil {
err = utils.Map2StructByJson(result, &skusResult, false)
err = JdMap2StructByJson(result, &skusResult, false)
}
return skusResult, err
}
@@ -227,7 +227,7 @@ func (a *API) adjustPromotionSku(promotionType int, infoId int64, outInfoId stri
jdParams["skus"] = skus
result, err := a.AccessAPINoPage(getPromotionCmd("adjustPromotionSku", promotionType), jdParams, nil, nil, genNoPageResultParser("errorCode", "data", "", "0"))
if err == nil && result != nil {
err = utils.Map2StructByJson(result, &skusResult, false)
err = JdMap2StructByJson(result, &skusResult, false)
}
return skusResult, err
}

View File

@@ -383,7 +383,7 @@ func (a *API) QuerySkuInfos(queryParam *QuerySkuParam) (skuList []*SkuMain, tota
}
result, totalCount, err := a.AccessAPIHavePage("pms/querySkuInfos", utils.Struct2MapByJson(queryParam), nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &skuList, false)
err = JdMap2StructByJson(result, &skuList, false)
}
return skuList, totalCount, err
}
@@ -393,7 +393,7 @@ func (a *API) QuerySkuInfos(queryParam *QuerySkuParam) (skuList []*SkuMain, tota
func (a *API) QueryListBySkuIds(queryParam *QueryListBySkuIdsParam) (imgList []*ImgHandleQueryResult, err error) {
result, err := a.AccessAPINoPage("order/queryListBySkuIds", utils.Struct2MapByJson(queryParam), nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &imgList, false)
err = JdMap2StructByJson(result, &imgList, false)
}
return imgList, err
}

View File

@@ -259,7 +259,7 @@ type UpdateStoreFreightParam struct {
func (a *API) GetAllCities() (cities []*CityInfo, err error) {
result, err := a.AccessAPINoPage("address/allcities", nil, nil, nil, genNoPageResultParser("code", "msg", "result", "0"))
if err == nil {
err = utils.Map2StructByJson(result, &cities, false)
err = JdMap2StructByJson(result, &cities, false)
}
return cities, err
}
@@ -311,7 +311,7 @@ func (a *API) CreateStore(createParams *OpStoreParams) (*CreateShopResult, error
func (a *API) GetStoreInfoByStationNo2(storeNo string) (storeDetail *StoreDetail, err error) {
result, err := a.AccessAPINoPage("storeapi/getStoreInfoByStationNo", utils.Params2Map("StoreNo", storeNo), nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &storeDetail, false)
err = JdMap2StructByJson(result, &storeDetail, false)
}
return storeDetail, err
}
@@ -357,7 +357,7 @@ func (a *API) GetCommentByOrderId2(orderId int64) (orderComment *OrderCommentInf
}
result, err := a.AccessAPINoPage("commentOutApi/getCommentByOrderId", jdParams, nil, nil, genNoPageResultParser("code", "msg", "result", "200"))
if err == nil {
err = utils.Map2StructByJson(result, &orderComment, false)
err = JdMap2StructByJson(result, &orderComment, false)
}
return orderComment, err
}
@@ -413,7 +413,7 @@ func (a *API) GetDeliveryRangeByStationNo2(stationNo string) (deliveryRange *Sto
}
result, err := a.AccessAPINoPage("store/getDeliveryRangeByStationNo", jdParams, nil, nil, nil)
if err == nil {
err = utils.Map2StructByJson(result, &deliveryRange, false)
err = JdMap2StructByJson(result, &deliveryRange, false)
}
return deliveryRange, err
}

View File

@@ -389,7 +389,7 @@ func (a *API) GetSkuPageInfo(skuId int64) (skuPageInfo *PageSku, err error) {
result, err := a.AccessStorePage("https://daojia.jd.com/client", params, false)
if err == nil {
err = utils.Map2StructByJson(result, &skuPageInfo, false)
err = JdMap2StructByJson(result, &skuPageInfo, false)
}
return skuPageInfo, err
}
@@ -419,7 +419,7 @@ func (a *API) GetStoreInfo(storeId string) (storeInfo map[string]interface{}, er
func (a *API) GetStoreInfo2(storeID string) (storeInfo *PageShopInfo, err error) {
retVal, err := a.GetStoreInfo(storeID)
if err == nil {
err = utils.Map2StructByJson(retVal, &storeInfo, false)
err = JdMap2StructByJson(retVal, &storeInfo, false)
}
return storeInfo, err
}
@@ -461,7 +461,7 @@ func (a *API) GetCorporationInfo(stationNo, qualifyNumber string) (corporatonInf
"qualifyNumber": qualifyNumber,
}, true)
if err == nil {
err = utils.Map2StructByJson(result, &corporatonInfo, false)
err = JdMap2StructByJson(result, &corporatonInfo, false)
}
return corporatonInfo, err
}

View File

@@ -144,14 +144,14 @@ func (a *API) GetStationInfoList(stationNo string, skuIds []int64) (priceInfo []
}
result, err := a.AccessAPINoPage("price/getStationInfoList", jdParams, nil, nil, genNoPageResultParser("code", "detail", "result", "0"))
if err == nil && result != nil {
err = utils.Map2StructByJson(result, &priceInfo, false)
err = JdMap2StructByJson(result, &priceInfo, false)
}
return priceInfo, err
}
func (a *API) handleBatchOpResult(outStationNo, stationNo string, batchCount int, inErr error, result interface{}, tagName string) (responseList []*StoreSkuBatchUpdateResponse, err error) {
if result != nil {
if err = utils.Map2Struct(result, &responseList, true, tagName); err == nil {
if err = utils.Map2Struct(result, &responseList, true, tagName, JavaDateHook); err == nil {
var failedList []*StoreSkuBatchUpdateResponse
for _, v := range responseList {
if v.Code != 0 {
@@ -287,7 +287,7 @@ func (a *API) QueryOpenUseable(listBaseStockCenterRequest []*BaseStockCenterRequ
}
result, err := a.AccessAPINoPage("stock/queryOpenUseable", jdParams, nil, nil, genNoPageResultParser("retCode", "retMsg", "data", "0"))
if err == nil && result != nil {
err = utils.Map2StructByJson(result, &stockResponse, false)
err = JdMap2StructByJson(result, &stockResponse, false)
}
return stockResponse, err
}
@@ -302,7 +302,7 @@ func (a *API) QueryStockCenter(outStationNo string, skuIds []*SkuIdEntity, userP
}
result, err := a.AccessAPINoPage("stock/queryStockCenter", jdParams, nil, nil, genNoPageResultParser("retCode", "retMsg", "data", "0"))
if err == nil && result != nil {
err = utils.Map2StructByJson(result, &vendibilityResponse, false)
err = JdMap2StructByJson(result, &vendibilityResponse, false)
}
return vendibilityResponse, err
}

View File

@@ -45,3 +45,7 @@ func (j *JavaDate) GoTime() time.Time {
}
return Timestamp2Time(j.Time / 1000)
}
func (j *JavaDate) String() string {
return Timestamp2Str(j.Time)
}

View File

@@ -17,6 +17,8 @@ import (
"github.com/gazeboxu/structs"
)
const MaxTimeSecond = 9573800254 // 正常最大的秒数
var (
DefaultTimeValue = Str2Time("1970-01-01 00:00:00")
ZeroTimeValue = time.Time{}
@@ -277,13 +279,14 @@ func Timestamp2Str(timestamp int64) string {
return Time2Str(Timestamp2Time(timestamp))
}
// timestamp为秒或毫秒
func Timestamp2Time(timestamp int64) time.Time {
const normalTimestamp = 1533709322
if timestamp > normalTimestamp*100 { // 传成毫秒了
baseapi.SugarLogger.Errorf("Timestamp2Time wrong timestamp:%d", timestamp)
timestamp = timestamp / 1000
nsec := int64(0)
if timestamp > MaxTimeSecond { // 传成毫秒了
nsec = (timestamp % 1000) * 1000000
timestamp /= 1000
}
return time.Unix(timestamp, 0)
return time.Unix(timestamp, nsec)
}
func Time2Str(t time.Time) string {
@@ -472,20 +475,24 @@ func Struct2FlatMap(obj interface{}) map[string]interface{} {
}
// !!! 此函数好像不支持struct是内嵌结构的
func Map2Struct(inObj interface{}, outObjAddr interface{}, weaklyTypedInput bool, tagName string) (err error) {
func Map2Struct(inObj interface{}, outObjAddr interface{}, weaklyTypedInput bool, tagName string, decodeHook interface{}) (err error) {
if tagName == "" {
tagName = "json"
}
if !weaklyTypedInput {
weaklyTypedInput = decodeHook != nil
}
decoder, _ := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
TagName: tagName,
Result: outObjAddr,
WeaklyTypedInput: weaklyTypedInput,
DecodeHook: decodeHook,
})
return decoder.Decode(inObj)
}
func Map2StructByJson(inObj interface{}, outObjAddr interface{}, weaklyTypedInput bool) (err error) {
return Map2Struct(inObj, outObjAddr, weaklyTypedInput, "")
return Map2Struct(inObj, outObjAddr, weaklyTypedInput, "", nil)
}
func Int64Slice2String(intList []int64) (outList []string) {