package freshfood import ( "errors" "net/http" "net/url" "time" "git.rosy.net.cn/baseapi/platformapi/dadaapi" "github.com/astaxie/beego" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/mtpsapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/legacy/controllers" "git.rosy.net.cn/jx-callback/legacy/jd/models" ) const ( URL_FRESHFOOD_ORDER_CREATE_JDDJ = "order" URL_FRESHFOOD_ORDER_STATUS = "order/status" URL_FRESHFOOD_ORDER_COMMENT = "comments/pushJdBadComments" URL_FRESHFOOD_DELIVERY_STATUS = "delivery/status" URL_FRESHFOOD_ORDER_MODIFY = "order/modify" URL_FRESHFOOD_ELEME_TOKENUPDATE = "eleme/token/update" URL_FRESHFOOD_ORDER_CREATE_ELEME = "order/eleme" URL_FRESHFOOD_ELEME_USER_URGE_ORDER = "reminders/pushElmSmsReminders" URL_FRESHFOOD_MTPS_DELIVERYSTATUS = "mtps/status" URL_FRESHFOOD_MTPS_EXCEPTION = "mtps/except" ) const ( URL_FRESHFOOD_PARA_JDORDER = "jdOrder" URL_FRESHFOOD_PARA_VENDORID = "venderId" URL_FRESHFOOD_PARA_ORDERID = "orderId" URL_FRESHFOOD_PARA_ORDERSTATUS = "orderStatus" URL_FRESHFOOD_PARA_ORDERSTATUSTIME = "orderStatusTime" URL_FRESHFOOD_PARA_CITYNAME = "cityName" URL_FRESHFOOD_PARA_BILLID = "billId" URL_FRESHFOOD_PARA_STATUSID = "statusId" URL_FRESHFOOD_PARA_DELIVERYSTATUS = "deliveryStatus" URL_FRESHFOOD_PARA_DLIVERYSTATUSTIME = "deliveryStatusTime" URL_FRESHFOOD_PARA_DELIVERYCARRIERNO = "deliveryCarrierNo" URL_FRESHFOOD_PARA_DELIVERYCARRIERNAME = "deliveryCarrierName" URL_FRESHFOOD_PARA_DELIVERYMANNO = "deliveryManNo" URL_FRESHFOOD_PARA_DELIVERYMANNAME = "deliveryManName" URL_FRESHFOOD_PARA_DELIVERYMANPHONE = "deliveryManPhone" URL_FRESHFOOD_PARA_ELEMEORDER = "elemeOrder" ) const ( URL_FRESHFOOD_PARA_DELIVERYID = "deliveryId" URL_FRESHFOOD_PARA_MTPEISONID = "mtPeisongId" // URL_FRESHFOOD_PARA_ORDERID = "orderId" URL_FRESHFOOD_PARA_STATUS = "status" URL_FRESHFOOD_PARA_COURIERNAME = "courierName" URL_FRESHFOOD_PARA_COURIERPHONE = "courierPhone" URL_FRESHFOOD_PARA_CANCELREASONID = "cancelReasonId" URL_FRESHFOOD_PARA_CANCELREASON = "cancelReason" URL_FRESHFOOD_PARA_APPKEY = "appkey" URL_FRESHFOOD_PARA_TIMESTAMP = "timestamp" URL_FRESHFOOD_PARA_SIGN = "sign" //转发美团配送异常消息 URL_FRESHFOOD_PARA_EXCEPTIONID = "exceptionId" URL_FRESHFOOD_PARA_EXCEPTIONCODE = "exceptionCode" URL_FRESHFOOD_PARA_EXCEPTIONDESC = "exceptionDesc" URL_FRESHFOOD_PARA_EXCEPTIONTIME = "exceptionTime" ) const ( //转发美团配送配送状态 URL_FRESHFOOD_DADADELIVERY_STATUS = "dadadelivery/status" URL_FRESHFOOD_PARA_CLIENTID = "clientId" URL_FRESHFOOD_PARA_CANCELFROM = "cancelFrom" URL_FRESHFOOD_PARA_UPDATETIME = "updateTime" URL_FRESHFOOD_PARA_DMID = "dmId" URL_FRESHFOOD_PARA_DMNAME = "dmName" URL_FRESHFOOD_PARA_DMMOBILE = "dmMobile" ) const ( URL_WX_UPDATE_ACCESSTOKEN = "weixin/accesstoken/update" ) const ( retryCount = 1 ) type API struct { baseURL string client *http.Client } var ( ErrFreshFooddReturnNot200 = errors.New("freshfood return code is not 200") ) var ( FreshFoodAPI *API ) func init() { FreshFoodAPI = New(beego.AppConfig.String("freshFoodServerURL")) } func New(baseURL string) *API { return &API{baseURL, &http.Client{Timeout: time.Millisecond * 2500}} // 2秒超时,因为JD那边的是3秒,超过3秒无意义 } func (f *API) AccessFreshFood(apiStr string, params url.Values) error { var err error var response *http.Response fullURL := f.baseURL + "/" + apiStr for i := 0; i < retryCount; i++ { if params != nil { // globals.SugarLogger.Debug(params.Encode()) response, err = f.client.PostForm(fullURL, params) } else { response, err = f.client.Get(fullURL) } // err = error(nil) // globals.SugarLogger.Debug(fullURL) // globals.SugarLogger.Debug(params) if err == nil && response != nil && response.StatusCode == 200 { break } else { globals.SugarLogger.Infof("AccessFreshFood Call %s error:%v, response: %v", fullURL, err, response) } } if err != nil || response.StatusCode != 200 { globals.SugarLogger.Infof("AccessFreshFood finally failed Call %s error:%v, url:%s, response: %v", fullURL, err, fullURL, response) if err != nil { return err } return ErrFreshFooddReturnNot200 } return nil } // jd api func (f *API) NewJDOrder(jdorder *models.Jdorder, isNew bool) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_JDORDER, string(utils.MustMarshal(jdorder))) if isNew { return f.AccessFreshFood(URL_FRESHFOOD_ORDER_CREATE_JDDJ, params) } return f.AccessFreshFood(URL_FRESHFOOD_ORDER_MODIFY, params) } func (f *API) JDOrderStatus(msg *jdapi.CallbackOrderMsg) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.JD_VENDORID)) params.Set(URL_FRESHFOOD_PARA_ORDERID, msg.BillID) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, msg.StatusID) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, msg.Timestamp) params.Set(URL_FRESHFOOD_PARA_CITYNAME, "all") return f.AccessFreshFood(URL_FRESHFOOD_ORDER_STATUS, params) } func (f *API) JDOrderComment(msg *jdapi.CallbackOrderMsg) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_BILLID, msg.BillID) params.Set(URL_FRESHFOOD_PARA_STATUSID, msg.StatusID) return f.AccessFreshFood(URL_FRESHFOOD_ORDER_COMMENT, params) } func (f *API) JDOrderDeliveryStatus(jdOrderDeliveryStatusMsg *jdapi.CallbackDeliveryStatusMsg) error { params := make(url.Values) cityName := "all" params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.JD_VENDORID)) params.Set(URL_FRESHFOOD_PARA_ORDERID, jdOrderDeliveryStatusMsg.OrderID) params.Set(URL_FRESHFOOD_PARA_DELIVERYSTATUS, jdOrderDeliveryStatusMsg.DeliveryStatus) params.Set(URL_FRESHFOOD_PARA_DLIVERYSTATUSTIME, jdOrderDeliveryStatusMsg.DeliveryStatusTime) params.Set(URL_FRESHFOOD_PARA_DELIVERYCARRIERNO, jdOrderDeliveryStatusMsg.DeliveryCarrierNo) params.Set(URL_FRESHFOOD_PARA_DELIVERYCARRIERNAME, jdOrderDeliveryStatusMsg.DeliveryCarrierName) params.Set(URL_FRESHFOOD_PARA_DELIVERYMANNO, jdOrderDeliveryStatusMsg.DeliveryManNo) params.Set(URL_FRESHFOOD_PARA_DELIVERYMANNAME, jdOrderDeliveryStatusMsg.DeliveryManName) params.Set(URL_FRESHFOOD_PARA_DELIVERYMANPHONE, jdOrderDeliveryStatusMsg.DeliveryManPhone) params.Set(URL_FRESHFOOD_PARA_CITYNAME, cityName) return f.AccessFreshFood(URL_FRESHFOOD_DELIVERY_STATUS, params) } // elm api func (f *API) NewELMOrder(order map[string]interface{}) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_ELEMEORDER, string(utils.MustMarshal(order))) return f.AccessFreshFood(URL_FRESHFOOD_ORDER_CREATE_ELEME, params) } func (f *API) ELMOrderStatus(orderId string, status int, statusTime string) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.ELM_VENDORID)) params.Set(URL_FRESHFOOD_PARA_ORDERID, orderId) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, utils.Int2Str(status)) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, statusTime) return f.AccessFreshFood(URL_FRESHFOOD_ORDER_STATUS, params) } func (f *API) ELMClientUrgeOrder(orderId string) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.ELM_VENDORID)) params.Set(URL_FRESHFOOD_PARA_ORDERID, orderId) return f.AccessFreshFood(URL_FRESHFOOD_ELEME_USER_URGE_ORDER, params) } // mtps api func (f *API) MtpsOrderStatusChanged(order *mtpsapi.CallbackOrderMsg) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_DELIVERYID, utils.Int64ToStr(order.DeliveryID)) params.Set(URL_FRESHFOOD_PARA_MTPEISONID, order.MtPeisongID) params.Set(URL_FRESHFOOD_PARA_ORDERID, order.OrderID) params.Set(URL_FRESHFOOD_PARA_STATUS, utils.Int2Str(order.Status)) params.Set(URL_FRESHFOOD_PARA_COURIERNAME, order.CourierName) params.Set(URL_FRESHFOOD_PARA_COURIERPHONE, order.CourierPhone) params.Set(URL_FRESHFOOD_PARA_CANCELREASONID, utils.Int2Str(order.CancelReasonId)) params.Set(URL_FRESHFOOD_PARA_CANCELREASON, order.CancelReason) params.Set(URL_FRESHFOOD_PARA_APPKEY, order.AppKey) params.Set(URL_FRESHFOOD_PARA_TIMESTAMP, utils.Int64ToStr(order.Timestamp)) params.Set(URL_FRESHFOOD_PARA_SIGN, order.Sign) return f.AccessFreshFood(URL_FRESHFOOD_MTPS_DELIVERYSTATUS, params) } func (f *API) MtpsOrderException(order *mtpsapi.CallbackOrderExceptionMsg) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_DELIVERYID, utils.Int64ToStr(order.DeliveryID)) params.Set(URL_FRESHFOOD_PARA_MTPEISONID, order.MtPeisongID) params.Set(URL_FRESHFOOD_PARA_ORDERID, order.OrderID) params.Set(URL_FRESHFOOD_PARA_EXCEPTIONID, utils.Int64ToStr(order.ExceptionID)) params.Set(URL_FRESHFOOD_PARA_EXCEPTIONCODE, utils.Int2Str(order.ExceptionCode)) params.Set(URL_FRESHFOOD_PARA_EXCEPTIONDESC, order.ExceptionDescr) params.Set(URL_FRESHFOOD_PARA_EXCEPTIONTIME, utils.Int64ToStr(order.ExceptionTime)) params.Set(URL_FRESHFOOD_PARA_COURIERNAME, order.CourierName) params.Set(URL_FRESHFOOD_PARA_COURIERPHONE, order.CourierPhone) params.Set(URL_FRESHFOOD_PARA_APPKEY, order.AppKey) params.Set(URL_FRESHFOOD_PARA_TIMESTAMP, utils.Int64ToStr(order.Timestamp)) params.Set(URL_FRESHFOOD_PARA_SIGN, order.Sign) return f.AccessFreshFood(URL_FRESHFOOD_MTPS_EXCEPTION, params) } // dada func (f *API) DadaOrderStatusChanged(msg *dadaapi.CallbackMsg) error { params := make(url.Values) params.Set(URL_FRESHFOOD_PARA_CLIENTID, msg.ClientID) params.Set(URL_FRESHFOOD_PARA_ORDERID, msg.OrderID) params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, utils.Int2Str(msg.OrderStatus)) params.Set(URL_FRESHFOOD_PARA_CANCELREASON, msg.CancelReason) params.Set(URL_FRESHFOOD_PARA_CANCELFROM, utils.Int2Str(msg.CancelFrom)) params.Set(URL_FRESHFOOD_PARA_UPDATETIME, utils.Int2Str(msg.UpdateTime)) params.Set(URL_FRESHFOOD_PARA_DMID, utils.Int2Str(msg.DmID)) params.Set(URL_FRESHFOOD_PARA_DMNAME, msg.DmName) params.Set(URL_FRESHFOOD_PARA_DMMOBILE, msg.DmMobile) return f.AccessFreshFood(URL_FRESHFOOD_DADADELIVERY_STATUS, params) } func (f *API) RefreshWeixinToken() error { return f.AccessFreshFood(URL_WX_UPDATE_ACCESSTOKEN, nil) } func (f *API) RefreshElmToken() error { return f.AccessFreshFood(URL_FRESHFOOD_ELEME_TOKENUPDATE, nil) }